ThreadLocal了解:
1.线程并发:在多线程并发的场景下
2.传递数据:我们可以通过ThreadLocal在同一线程,不同组件中传递公共变量
3.线程隔离:每个线程的变量都是独立的,不会互相影响
ThreadLocal<T>在项目中用是一般都有大佬写成一个工具类,写出他的所有statis方法,在这里我就把我们项目里的工具方法展示一下,因为ThreaLocal的方法其实就几个,这里写的也很全:
public class BaseContext {
public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
public static void setCurrentId(Long id) {
threadLocal.set(id);
}
public static Long getCurrentId() {
return threadLocal.get();
}
public static void removeCurrentId() {
threadLocal.remove();
}
}
//解决TODO //ToDo: 后面需要动态获取登录用户ID
//从THreadLocal中获取登录id
Long currentId = BaseContext.getCurrentId();//线程获取
employee1.setCreateUser(currentId);
employee1.setUpdateUser(currentId);
TreadLocal<T>是Java中用于在多线程环境下存储线程局部变量的类。它通过为每个线程提供一个独立的副本来确保线程安全性。然而,如果不正确地使用ThreadLocal,可能会导致内存泄露。
内存泄露问题通常发生在使用ThreadLocal的时候,但没有在使用完毕后及时清理,导致线程局部变量引用的对象无法被垃圾回收。
为了避免ThreadLocal导致的内存泄露问题,可以采取以下几种方法:
1.及时清理:
在使用完ThreadLocal存储的对象后,应该调用ThreadLocal的remove()方法清理掉对应的副本。可以在finally块中实现,确保无论是否发生异常,都能正确清理。
2.使用弱引用:
可以考虑使用ThreadLocal的弱引用版本,即使用WeakReference来存储对象。这样一旦对象没有被其他强引用持有,就能被垃圾回收。
3.使用线程池时注意处理:
在使用线程池的情况下,如果不进行适当的处理,可能会导致ThreadLocal的值在线程间共享。因此,当使用线程池时,应该在每次使用前清理ThreadLocal的值,可以通过覆盖线程池的beforeExecute()方法来实现清理操作。
总的来说,合理使用ThreadLocal并及时清理是避免内存泄露问题的关键。根据具体的场景和需求,选择适当的方法来解决可能的内存泄露问题。
这里考虑一个问题,我用synchronized锁的话是不是也锁定当前的这个线程,然后我们就考虑最开始的ThreadLocal的第一个特性,它用于在多线程并发的场景下,而synchronized虽然也用在多线程的情况下,但是他是在某种程度上把多线程改变成了单线程的环境。
synchronized说:排好队!一个一个来!!!
宫本:......!这是我的词。。。!