ThreadLocal原理解析

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


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

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

下面是ThreadLocal的set方法:

ThreadLocal原理解析

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

下面是 ThreadLocal的get方法


ThreadLocal原理解析


 ThreadLocal原理解析


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

 

3.Threadlocal的生命周期

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

 

 

ThreadLocal原理解析

上一篇:Java打印和打印预览机制


下一篇:Shell的入门