码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-03-11 13:31:20      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:内存泄露   弱引用   保存   ash   同步控制   adl   无法   oca   需要   

实现

各个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实现

标签:内存泄露   弱引用   保存   ash   同步控制   adl   无法   oca   需要   

原文地址:https://www.cnblogs.com/linlei2099/p/10509895.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!