- 线程间相互隔离的,线程内全局变量
- 并不是为了解决并发或者共享变量的问题
- 一般为static 的全局变量,方便整个线程中使用
- 一般情况下,会随着线程的销毁而销毁,但在线程复用,比如使用线程池时,因为新城长时间不销毁,就要警惕内存泄漏
- 实现方式是:thread内部有个成员变量threadLocalMap,用来存储键值对
- threadLocalMap其实是个WeakHashMap,使用弱引用map的目的是,如果key都不可达了,那也没必要再放到map里了
- 实际上,就是增加了一种监控机制,如果key都不使用了,也就可以清理了
- 什么时候使用弱引用呢: 当有多个引用同时指向一个对象时,当其中某一个引用失效后,这个对象就变得没有意义了,那就可以将其他的引用写成弱引用
- 两个使用场景:线程上线文,每个线程需要独立副本空间换时间
- ThreadLocal 适用于变量在线程间隔离且在方法间共享的场景
- ThreadLocal 回收,有两个时机:
- 一个是thread不存在,就都回收了,因为threadLoalMap都是thread的成员变量,所以thread不存在,自然就都没有了
- 另一个是,key先被回收,然后,在get或者set的时候,联动value的回收,key其实就是threadLocal
Java进阶(七)正确理解Thread Local的原理与适用场景
ThreadLocal源码分析
并发编程 | ThreadLocal 源码深入分析
线程的私家小院儿:ThreadLocal
ThreadLocalMap和线程的生命周期是一致的,所以线程无,则ThreadLocalMap无,threadlocal全都没了
问题是,threadLocal其实只是key,怎么保证每个线程的threadlocal都不一样呢
x
网友评论