一、ThreadLocal 与 Synchronized 区别
ThreadLocal:
- 采用"以空间换时间"的方式,为每一个线程都提供了一份变量的副本,从而实现同时访问而互不干扰
- 多线程中让每个线程之间的数据相互隔离
Synchronized
- 同步机制采用"以时间换空间"的方式,值提供一份变量,荣不同的线程排队访问
- 对个线程之间访问资源的同步
二、ThreadLocal 方案的好处
- 传递数据: 保存每个线程绑定的数据,在需要的地方可以直接过去,避免参数直接传递带来的代码耦合问题
- 线程隔离: 各线程之间的数据相互隔离却又具备并发性,避免同步方式带来的性能损失
三、ThreadLocal 内存泄漏
根源是由于,ThreawdLocalMap 的生命周期跟 Thread 一样长,如果没有手动删除对应的 entry 就对导致内存泄漏
四、避免内存泄漏的方法
- 使用完 ThreadLocal ,调用其 remove 方法删除对应的 Entry
- (or)使用完 ThreadLocal,当前 Thread 也随之运行结束
五、为什么 Entry 的key 使用弱引用指向 ThreadLocal
事实上,在 ThreadLocalMap 中的 set/getEntry 方法中,会对 key 为 null (即 ThreadLocal 为 null)进行判断,如果为 null,则将 value 置为 null
这意味着使用完 ThreadLocal,CurrentThread 依然运行的前提下,就算忘记调用 remove 方法,弱引用比强引用可以多一层保障:
弱引用的 ThreadLocal 会被回收,对应的 value 在下一次 ThreadLocalMap 调用 set,get,remove 中的任一方法时会被清除,从而避免内存泄漏
六、Hash 冲突的解决
ThreadLocalMap 使用 线性探测法 来解决 hash 冲突
该方法一次探测下一个地址,直到有空的地址后插入,若整个空间都找不到空余的地址,则产生溢出。