skip to content
BinArtale

ThreadLocal

/ 2 min read

ThreadLocal是什么

ThreadLocal是Java用来实现线程间数据隔离的机制,他会给每个线程创建共享变量的副本,这样就能保证对该共享变量的修改不会影响到其他线程。他可以使用get()set() 方法来获取默认值或者将值修改为当前线程所持有的变量值,从而避免了线程安全问题。

ThreadLocal的原理

每一个线程内部都有一个ThreadLocalMap 类型的对象,可以将其理解为一个定制化的HashMapThreadLocalMap 由一个个Entry 构成,Entry 可以存储以ThreadLocalkeyObjectvalue 的键值对,最终被存放在当前线程内部的ThreadLocalMap 中,每个线程的Map 都是不一样的,各自存储各自的变量,这就实现了隔离。

ThreadLocal内存泄露问题

ThreadLocalMapEntry 中,key 是对ThreadLocal 对象t1 的弱引用,当程序中其他代码中不再持有该ThreadLocal 对象t1 的任何强引用时,在下一次GC发生的时候,这个ThreadLocal 对象 t1 就可以被回收,此时对应Entry中的key 会被自动设置为null,这样ThreadLocalMap中就会出现key为null的Entry ,假如我们不做任何措施,value 永远无法被GC回收,这时候就可能产生内存泄露。 ThreadLocalMap 的实现中考虑了这些情况,在调用set()、get()、remove() 方法时,会清楚掉keynull 的记录,但是仍推荐手动remove()