作者:李红序,转载时请指明作者出处 QQ群号: JAVA高级技术交流(215597268)
ThreadLocal的目的:为当前线程绑定一个值,解决线程安全问题。
ThreadLocal的实现方式(线程与值的绑定):
下面是ThreadLocal的set方法:
根据当前线程获取其 ThreadLocalMap对象,来执行绑定操作。
下面是 ThreadLocal的get方法
是根据当前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方法。