ThreadLocal:它将自己作为key,set的值作为value存储在当前线程的ThreadLocalMap里,也就是说一个线程可以查询到绑定在这个线程上面的值,在多线程的环境下防止自己的变量被其它线程修改
1、为什么可以隔离线程数据
每一个线程都有属于自己的ThreadLocalMap
2、为什么有哈希冲突
因为一个线程可以绑定好几个值
ThreadLocal local1
ThreadLocal local2
local1和local2可能可能存在哈希冲突
3、如何解决哈希冲突
链表法和线性探测ThreadLocal采用线性探测
4、为什么存在内存泄漏
当ThreadLocal没有引用的时候会被回收,而set的值还有可能存在,所以造成内存泄漏
ThreadLocal被设计成弱引用下一次垃圾收集之前会被回收(关于引用juejin.cn/post/685663…)
5、如何解决内存泄漏问题
在使用完之后remove掉或者将ThreadLocal设计成static使其生命周期延长
6、使用场景
Hibernate中的session,每个线程访问数据库都应该是一个独立的session会话,如果多个线程共享一个session的话会导致当前线程提交的时候出现会话关闭
具体的分析参考:juejin.cn/post/686259…