Java进阶(七)正确理解Thread Local的原理与适用场景
java——ThreadLocal、ThreadLocalMap、Thread三者的关系
Thread 中维护了 ThreadLocalMap 作为成员变量
ThreadLocalMap的key和value分别是ThreadLocal实例的弱引用对象和我们要存储的值
为什么要弱引用:
ThreadLocal 适用于如下两种场景:
- 每个线程需要有自己单独的实例
- 实例需要在多个方法中共享,但不希望被多线程共享
总结
- ThreadLocal 不解决线程间共享数据的问题
- ThreadLocal 通过隐式的在不同线程内创建独立实例副本避免了实例线程安全的问题
- 每个线程持有一个 Map 并维护了 ThreadLocal 对象与具体实例的映射,该 Map 由于只被持有它的线程访问,故不存在线程安全以及锁的问题
- ThreadLocalMap 的 Entry 对 ThreadLocal 的引用为弱引用,避免了 ThreadLocal 对象无法被回收的问题
- ThreadLocalMap 的 set 方法通过调用 replaceStaleEntry 方法回收键为 null 的 Entry 对象的值(即为具体实例)以及 Entry 对象本身从而防止内存泄漏
- ThreadLocal 适用于变量在线程间隔离且在方法间共享的场景
ThreadLocal 是弱引用