一.参考
1.使用及原理
https://www.jianshu.com/p/3c5d7f09dfbd
2.使用场景
https://www.cnblogs.com/zz-ksw/p/12684877.html
https://blog.csdn.net/Mind_programmonkey/article/details/118220731
https://www.cnblogs.com/yxysuanfa/p/7125761.html
二.可能会问的问题
1.Thread,ThreadLocalMap,ThreadLocal的对应关系
2.为什么ThreadLocalMap设计成ThreadLocal的内部类
3.ThreadLocalMap 什么时候开始和Thread 进行绑定的呢
2和3参考:https://blog.csdn.net/weixin_45127309/article/details/102746772
4.ThreadLocalMap什么情况下发生冲突?
通过map.set(threadLocal,value)插入entry,当两个不同的threadLocal的hash值相同时,产生冲突,利用线性探测解决冲突。
5.ThreadLocalMap中Entry的key为什么是弱引用?
参考:
https://zhuanlan.zhihu.com/p/139214244
https://www.cnblogs.com/waterystone/p/6612202.html
三.我自己的一点理解
基于这篇文章(https://blog.csdn.net/Mind_programmonkey/article/details/118220731)的典型场景2:当前用户信息需要被线程内所有方法共享。
- 在这种场景下,ThreadLocal对象引用是静态的,即整个进程就一份,多个线程拿到的实例是同一个。但根据运行结果来看,每个线程以同一个ThreadLocal对象为key,通过ThreadLocal的get()拿到的value又是每个线程自己独有的。
- 这个场景中ThreadLocal的使用很好的解释了ThreadLocal的两大优点:
(1)具有线程隔离的效果,A线程内获取到是A线程对应的值,B线程获取到是B线程对应的值,即使ThreadLocal实例是同一个。
(2)本线程内ThreadLocal设置过得值,可以让不同方法直接使用,避免参数传递的麻烦。