`

threadlocal分析

 
阅读更多
 

 

 

ThreadLocal的目的:为当前线程绑定一个值,解决线程安全问题。

 

ThreadLocal的实现方式(线程与值的绑定)

下面是ThreadLocalset方法:

 



 根据当前线程获取其 ThreadLocalMap对象,来执行绑定操作。

下面是 ThreadLocalget方法

 

 

 





  

是根据当前ThreadLocal对象来获取 entry的值, threadLocalHashCode与长度减一相与,求出哈希表的位置。

 

 

 

 

3.Threadlocal的生命周期


 
 

每个thread中都存在一个map, map的类型是ThreadLocal.ThreadLocalMap. Map中的key为一个threadlocal实例. 这个Map的确使用了弱引用,不过弱引用只是针对key. 每个key都弱引用指向threadlocal. 像上面code中的例子,当把threadlocal实例tl置为null以后,没有任何强引用指向threadlocal实例,所以 threadlocal将会被gc回收. 但是,我们的value却不能回收,因为存在一条从current thread连接过来的强引用. 只有当前thread结束以后, current thread就不会存在栈中,强引用断开, Current Thread, Map, value将全部被GC回收.

从中可以看出,弱引用只存在于key,所以key会被回收. value还存在着强引用.只有thead退出以后,value的强引用链条才会断掉

 

需要注意的问题

1)ThreadLocal需要注意的问题,每次执行完毕后,要使用remove()方法来清空对象,否则 ThreadLocal 存放大对象后,会出现OMM

2) ThreadLocal要使用static的 ,在其他地方可以直接用get set方法。

 

 

 

  • 大小: 24.8 KB
  • 大小: 11 KB
  • 大小: 5.2 KB
  • 大小: 106.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics