一、ThreadLocal的概念
ThreadLocal并不是线程,而是Thread的一个局部变量,每个线程都有自己的ThreadLocal变量,可以通过get()和set()方法来获取相应值。ThreadLocal设计的初衷是为了解决多线程编程中的资源共享问题,不同于synchronized,ThreadLocal是为每个使用该变量的线程提供独立的变量副本,在各自线程内部,相当于“全局变量”,保证各自线程内操作的是同一个对象,不同于Hashmap数组+链表/红黑树的结构,ThreadLocalmap通过Entry数组保存局部变量,相对于synchronized的“以时间换空间”,ThreadLocal是“以空间换时间”,实现了线程的数据隔离。
二、ThreadLocal原理
源码存在于jdk上,这里不再具体分析,感兴趣可自行探究
- 每个Thread具有ThreadLocal这各局部变量
- ThreadLocalMap是ThreadLocal的内部类,通过Entry存储
- key-value,key是ThreadLocal对象,值是被包装的对象
- set()方法,往ThreadLocalMap设置值,get()方法获取被包装的对象值
这里需要注意的一点是,ThreadLocalMap的生命周期跟Thread一样,ThreadLocal中使用的 key 为 ThreadLocal的弱引用,而 value 是强引用。所以,如果 ThreadLocal没有被外部强引用的情