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();
}
}
我创建了这样一个threadlocal实用程序类来存储用户的ID。每次收到http请求时我都会在拦截器中使用这个类。我查了文档,发现threadlocalmap中对threadlocal的弱引用是为了当外部对threadlocal的强引用消失时,GC回收threadlocal,使得entry中的key为空。带有空键的条目将在下一个 set、get 和remove 中被删除。
我的问题是,我的实用程序类似乎永远不会失去对 threadlocal 的强引用,因此弱引用似乎失去了意义。这样的弱引用机制在什么情况下起作用呢? threadlocal 是否在其他地方定义了?
ThreadLocal
使用 WeakReference
意味着它将被删除,尽管在使用此 ThreadLocal
的线程中存在引用。这也意味着在 Thread
死亡后,ThreadLocal
中与其相关的任何值都将被 GC 处理。