本文是对项目实战中出现的6个问题进行的总结,希望通过总结的方式,提升自己的技术水平,避免类似的错误。
上文涉及到的知识点主要有
线程是共享全局变量的,如果在业务过程中,对全局变量进行修改操作。在多线程的情况下,会产生全局变量数据混乱问题。
直接上代码
package org.example;public class Main {static ThreadLocal localVar = ThreadLocal.withInitial(() -> "默认localVar");static void print(String str){//打印当前线程内存储的本地变量的值System.out.println( str +" de~~~ " + localVar.get());}public static void main(String[] args) {//创建线程一Thread thread1 = new Thread(new Runnable() {@Overridepublic void run() {//打印一下localvar的值System.out.println("thread1线程" + localVar.get());//修改一下localvar的值localVar.set("thread1的local");//打印print("thread1");}});thread1.start();//创建线程二Thread thread2 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("线程二不共享localVar变量,值为默认值" + localVar.get());}});thread2.start();}
}
上述代码
执行结果
从结果上我们可以看出 第一个线程修改了我们定义的localVar的值之后,第二个线程打印的仍是我们一开始初始化设置的默认值
结论:ThreadLocal 定义的变量是线程安全的
在查询的逻辑里添加了 createDate的字段,这里的createDate是按照天取得年月日。如果跨天就会出现问题。
登录状态问题,这里的状态在之前的业务里,已经传入了,但是后续却用了一个魔法值表示,虽然功能上没有出现问题,但是却多了一个写死的值,不利与复用。
此sql对应的是教师进行结课之后,将学生的最近登录时间修改。这里存在两个问题。
ava中继承关系的父子类,相同的方法会被重写
当子类父类中的成员没有重名时,子类都可以通过this去调用。
当成员方法 重名,子类就会将父类中的方法进行重写。如果还想调用父类中的方法只能通过 super去进行调用。
当时成员变量不存在覆盖重写:在子类中只能通过super调用父类的
索引会因为 隐示数据转换造成 索引失效的问题。在设置外键的时候,一定要保持与相对应的主键的数据类型一致,否则查询的时候,就会出现不走索引的慢sql。
具体原因可以参考:mysql索引博客
使用技术的时候,一定要清楚使用边界。出现问题要及时总结,保证不出同样的问题。