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

Posted linlei2099

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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内的引用都无法被回收,会导致内存泄露的效果。

以上是关于ThreadLocal为什么不使用Thread-value实现的主要内容,如果未能解决你的问题,请参考以下文章

再也不学Threadlocal了,看这一篇就忘不掉了(万字总结)

通过一个案例分析为什么使用ThreadLocal,使用它的好处是什么

ThreadLocal详解,处理成员变量线程不安全的情况

ThreadLocal详解

ThreadLocal详解

ThreadLocal详解