并发编程:ThreadLocal
什么是ThreadLocal
ThreadLocal正如其名,是一个线程本地变量,每个线程独自持有,保证了该变量的线程安全性,还可以在线程上下文中传递。
ThreadLocal如何实现
每个线程中存在一个ThreadLocalMap对象,key是ThreadLocal对象本身,value是ThreadLocal对象set的值。
Map->key是一个弱引用,每次垃圾回收的时候都会去尝试回收key。
ThreadLocal与内存泄漏
这里其实就引发出一个问题,我们平时通常是使用线程池来管理线程的。当线程池中的线程的ThreadLocal对象被set了值并使用以后,key在强引用结束后就会随着gc被回收,然而value却仍然在map中存在直接引用,导致无法回收,这时候就引发了内存泄漏。所以我们必须在使用完对应的对象时,调用threadlocal.remove()方法防止内存泄漏。(当然threadlocal本身也有一些优化,在调用它的get,set方法时会把无直接引用的value释放掉,但是假如一直不调用get,set方法,还是会内存泄漏)