1.什么是ThreadLocal
它是一个本地线程副本变量的工具,用于私有线程和该线程存放的副本对象做一个映射,实现多个线程之间的变量互不干扰。
2.ThreadLocal 工作原理是什么?
每一个线程都会有一个ThreadLocalMap,他是(key,value)格式,他的key是一个弱引用,也就是ThreadLocal本身,而他的value就是存储的副本变量,也就是说,ThreadLocal并不参与存储变量,而是作为一个工具,用来维护线程中的Map,帮助它存取变量。
3.ThreadLocal 如何解决 Hash 冲突
ThreadLocal和HashMap不一样,并不是利用链式结构去解决hash冲突,而是采用线性探测的方式。所谓线性探测,就是根据初始 key 的 hashcode 值确定元素在 table 数组中的位置,如果发现这个位置上已经被其他的 key 值占用,则利用固定的算法寻找一定步长的下个位置,依次判断,直至找到能够存放的位置。
4.ThreadLocal 的内存泄露是怎么回事?
因为ThreadLocalMap 的key是弱引用,当JVM进行垃圾回收时会把key回收掉,而map的value是强引用,JVM无法回收它,就会一直储存在内存中,因而导致内存泄漏。
5.为什么 ThreadLocalMap 的 key 是弱引用
如果是强引用,ThreadLocal对象被回收时,由于ThreadLocalMap还保持强引用,如果不进行手动回收,还是会导致内存泄漏,而是弱引用的话,在调用set,get,remove的时候会被清除。
6.ThreadLocal 的应用场景有哪些
适用于独立变量副本的情况,比如Hibernate的session获取场景。