static class ThreadLocalMap {
private Entry[] table;
}
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal k, Object v) {
super(k);
value = v;
}
}
// 示例场景
new Thread(){
public void run(){
func1();
}
// 新建了一个 ThreadLocal 对象,t1 是强引用指向这个对象
// 调用 set() 后,新建一个 Entry 对象,key 弱引用指向这个对象
public void func1() {
ThreadLocal tl = new ThreadLocal<Integer>();
tl.set(100);
tl.get();
}
}
我们要在不使用某个 ThreadLocal 对象后,手动调用 remoev 方法来删除它,尤其是在线程池中,不仅仅是内存泄露的问题,因为线程池中的线程是重复使用的,意味着这个线程的 ThreadLocalMap 对象也是重复使用的,如果我们不手动调用 remove 方法,那么后面的线程就有可能获取到上个线程遗留下来的 value 值,造成 bug。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。