-
底层实现
ThreadLocal 底层是通过 ThreadLocalMap 来实现的。每个Thread对象都存在一个 ThreadLocalMap ,key为ThreadLocal对象,value为需要缓存的值。
-
ThreadLocal 与 线程池
如果在线程池中使用ThreadLocal 会造成内存泄漏。
因为线程池中的线程不会被回收,而线程对象是强引用指向 ThreadLocalMap,ThreadLocalMap也是强引用指向Entry对象;线程不会回收,Entry对象也就不会被回收,从而出现内存泄漏。
正确的做法是,使用了ThreadLocal对象后,手动调用 ThreadLocal 的remove方法,手动清除Entry对象。
(ThreadLocal 是弱引用对象?GC时只能回收它,value不能被回收?——弱引用,内存不够会回收)
-
ThreadLocal 最经典的应用场景就是连接管理。一个线程持有一个对象,该连接对象可以在不同的方法之间传递,线程之间不共享同一个连接。