ThreadLocal为什么不使用Thread-value实现

实现

各个Thread对象保存一个ThreadLocalMap<ThreadLocal,value>,保存的是本Thread涉及的所有的ThreadLocal变量的本线程版本数据。

一个app中可能多出用到不同的ThreadLocal,tl1被t1 t3使用,tl2被t1,t2,t4使用,所以t1的Map中保存了两个entry。

为什么不是的Map<Thread,Value>的实现

假如一个ThreadLocal对象是一个Thread-Value简单map,那么需要保证这个map本身并发安全。已经知道HashMap在扩容时会发生死循环。

优点

  • 并发程度

所以,现在是在实现时,真的把ThreadLocal代表的语义变量设置到了线程局部变——Thread对象的私有数据中。
而如果使用Map<Thread,Value>实现,实际上还是使用共享的结构控制模拟出局部的效果。需要同步控制。

  • 内存泄露

Entry是弱引用,所以当tl对象本身可以回收的时候,Entry不会阻止tl被回收。
而如果中心化的共享Map<Thread,Value>,当变量的部分线程版本已经可以回收,但是由于Map中还有其他线程版本的变量在使用,所以整个Map内的引用都无法被回收,会导致内存泄露的效果。

猜你喜欢

转载自www.cnblogs.com/linlei2099/p/10509895.html