标签:内存泄露 弱引用 保存 ash 同步控制 adl 无法 oca 需要
各个Thread对象保存一个ThreadLocalMap<ThreadLocal,value>
,保存的是本Thread涉及的所有的ThreadLocal变量的本线程版本数据。
一个app中可能多出用到不同的ThreadLocal,tl1被t1 t3使用,tl2被t1,t2,t4使用,所以t1的Map中保存了两个entry。
假如一个ThreadLocal对象是一个Thread-Value简单map,那么需要保证这个map本身并发安全。已经知道HashMap在扩容时会发生死循环。
所以,现在是在实现时,真的把ThreadLocal代表的语义变量设置到了线程局部变——Thread对象的私有数据中。
而如果使用Map<Thread,Value>实现,实际上还是使用共享的结构控制模拟出局部的效果。需要同步控制。
Entry是弱引用,所以当tl对象本身可以回收的时候,Entry不会阻止tl被回收。
而如果中心化的共享Map<Thread,Value>,当变量的部分线程版本已经可以回收,但是由于Map中还有其他线程版本的变量在使用,所以整个Map内的引用都无法被回收,会导致内存泄露的效果。
ThreadLocal为什么不使用Thread-value实现
标签:内存泄露 弱引用 保存 ash 同步控制 adl 无法 oca 需要
原文地址:https://www.cnblogs.com/linlei2099/p/10509895.html