1 ThreadLocal的设计
每个线程Thread都有一个ThreadLocalMap属性,这个ThreadLocalMap类似HashMap,不过ThreadLocalMap是通过“线性探测法”解决的哈希冲突。
2 ThreadLocal在堆栈中如何存放的
-
首先我们明确key是使用了弱引用,当把threadlocal变量置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal实例就可以顺利被 gc。
-
我们从图中也能看到虽然key被gc回收了,但是value还在呀。因为存在一条从 current thread连接过来的强引用。只有当前thread结束以后,current thread 就不会存在栈中,强引用断开,Current Thread, Map, value将全部被GC回收。
总结:就算map的Entry没有被显示的清除,如果线程被销毁,也是可以避免内存泄露的。
备注:JDK7的ThreadLocal
从图中可以看到,map中的key是Thread对象、value是当前线程的局部变量值。当线程销毁即key被回收后,ThreadLocal依然存在,即map中的value无法被回收。所以,如果map的Entry没有被显示的清除,就会导致内存泄露。