0. ThreadLocal的使用:在线程外创建ThreadLocal类型的threadLocal变量, threadLocal.set(v) 将threadLocal作为key,v作为value放入在每个线程中创建的ThreadLocalMap中的一个entry里,一个Tread持有一个ThreadLocal.ThreadLocalMap,可以进行多个不同的threadlocal.set()。
1. 对于每个map,例如hashMap,只要原本的key丢失了,value对象就会发生泄露。但是对于hashMap,回收hashMap即可回收掉里面的table里所有的元素。
2. 在使用线程池时,线程不会被轻易回收,ThreadLocalMap也就不会轻易回收,所以需要一些策略解决内存泄露问题。
3. 用户在threadlocal不使用时,可以调用remove()来回收对应entry中的value。
4. 为了防止用户不自主回收value,ThreadLocal类采用如下设计,Entry中的key弱引用持有threadLocal对象,在threadLocal引用为null时,threadLocal对象会被很快回收,也就是Entry中的key会置为null。这样就知道了哪些value已经无效了。
5. 在调用set(),get(),remove()时,都有相应的策略去清理已经无效的value。
标签: