ThreadLocal初探

160 阅读1分钟

    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…