ThreadLocal深入解析

ThreadLocal实现原理

ThreadLocal深入解析_第1张图片
Paste_Image.png

1.原理
ThreadLocal本身是不对数据进行存储的,真正存储的数据的地方还是线程之中,线程会维护ThreadLocalMap的映射表。其中key就是你创建ThreadLocal对象的实例,value是真正存储数据的地方。图中的虚线,是当前线程使用你创建的ThreadLocal对象的弱引用作为的key,而弱引用的对象在GC的时候会被回收。由此会引出下文中的内存泄漏。
2.ThreadLocal泄漏原因
ThreadLocalMap使用ThreadLocal的弱引用作为key,如果一个ThreadLocal没有外部强引用来引用它,那么系统 GC 的时候,这个ThreadLocal势必会被回收,这样一来,ThreadLocalMap中就会出现key为null的Entry,就没有办法访问这些key为null的Entry的value,如果当前线程再迟迟不结束的话,这些key为null的Entry的value就会一直存在一条强引用链:Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value永远无法回收,造成内存泄漏。
其实,ThreadLocalMap的设计中已经考虑到这种情况,也加上了一些防护措施:在ThreadLocal的get(),set(),remove()的时候都会清除线程ThreadLocalMap里所有key为null的value。
3.使用
一般都通过创建静态变量,来使用ThreadLocal。需要保证线程为单例模式

你可能感兴趣的:(ThreadLocal深入解析)