ThreadLocal的作用:提供线程内的局部变量,不同的线程直接不会相互干扰,这种变量在线程的生命周期内起作用,减少统一线程多个函数各之间一些公共变量传参的复杂度。
- 线程并发:在多线程并发的场景下
- 传递参数:我们可以通过ThreadLocal在统一线程,不同组件之间传递公共变量。
- 线程隔离:每个线程的变量都是独立的,不会互相影响
ThreadLocal和synchronized区别
synchronized | ThreadLocal | |
原理 | 同步集中采用“时间换空间”的方式,只提供了一份变量,让不同的线程排队访问 | ThreadLocal采用“空间换时间”的方式,为每一个线程都提供了一个变量的副本,从而实现同时访问,互不干扰 |
侧重点 | d多个线程之间访问资源的同步 | d多线程让每个线程之间的数据相互隔离 |
ThreadLocal内部结构
应用场景:
数据库事务操作,还有MVC框架中数据跨层传递
内存泄漏与弱引用无关:
避免内存泄漏的方式:
- 手动删除Entry
- 线程运行结束
实际应用中,使用线程池,线程是不会销毁的,只要及时remove.就不会出现内存泄漏。即使忘记remove .下一次set 或则 get的是时候,会判空,重置null. 所以弱引用比强引用多了一层保障。弱引用的threadlocal会被回收。其对应的value会在下一次threadlocalmap set或者get的时候清除