首页 > 其他 > 详细

ThreadLocal原理解析

时间:2014-01-23 23:51:41      阅读:1681      评论:0      收藏:0      [点我收藏+]

 作者:李红序,转载时请指明作者出处  QQ群号: JAVA高级技术交流(215597268)


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

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

下面是ThreadLocal的set方法:

bubuko.com,布布扣

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

下面是 ThreadLocal的get方法


bubuko.com,布布扣


 bubuko.com,布布扣


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

 

3.Threadlocal的生命周期

bubuko.com,布布扣

每个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方法。

 

 

ThreadLocal原理解析

原文:http://blog.csdn.net/statckoverflow/article/details/18702309

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!