ThreadLocal

有啥用(解决了什么问题)??

ThreadLocal是一个创建线程局部变量的类,通常情况我们创建的变量是可以被任何一个线程去访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。

这样把数据的可见范围限制在一个线程之内,其他线程无法访问,从而避免了线程安全问题。

怎么用?

在线程内通过set方法设置当前线程在ThreadLocal的所存的副本的值,通过get方法获取该线程存储在ThreadLocal的值。

原理了解吗?

每一个Thread类有一个Thread.ThreadLocalMap变量,这个ThreadlocalMap可以理解为key为ThreadLocal对象,value为我们set方法放进去的值,默认情况下为null,只有线程调用set和get方法时才会创建map。

我们通过set方法放进去的值实际上是存在这个ThreadLocalMap中,ThreadLocal类只是对这个Map的封装,传递了变量值。

在ThreadLocal类中,无论是set还是get方法,都先要通过getMap方法将当前线程Thread作为参数,获得这个线程的ThreadLocalMap,获得Map之后,就根据读或者是写进行读写操作了。

内存泄露问题了解吗?

ThreadLocalMap的key为ThreadLocal为弱引用,而value是强引用。当ThreadLocal在没有被外部强引用的情况下,在下一次垃圾回收的key会被清理掉,而value不会。所以ThreadLocalMap中就会出现Key为null的Entry。如果不去调用set(),get(),remove()方法去处理,就会出现内存泄漏的情况。