ThreadLocal

  • 线程间相互隔离的,线程内全局变量
  • 并不是为了解决并发或者共享变量的问题
  • 一般为static 的全局变量,方便整个线程中使用
  • 一般情况下,会随着线程的销毁而销毁,但在线程复用,比如使用线程池时,因为新城长时间不销毁,就要警惕内存泄漏
  • 实现方式是:thread内部有个成员变量threadLocalMap,用来存储键值对
  • threadLocalMap其实是个WeakHashMap,使用弱引用map的目的是,如果key都不可达了,那也没必要再放到map里了
  • 实际上,就是增加了一种监控机制,如果key都不使用了,也就可以清理了
  • 什么时候使用弱引用呢: 当有多个引用同时指向一个对象时,当其中某一个引用失效后,这个对象就变得没有意义了,那就可以将其他的引用写成弱引用
  • 两个使用场景:线程上线文,每个线程需要独立副本空间换时间
  • ThreadLocal 适用于变量在线程间隔离且在方法间共享的场景
  • ThreadLocal 回收,有两个时机:
  1. 一个是thread不存在,就都回收了,因为threadLoalMap都是thread的成员变量,所以thread不存在,自然就都没有了
  2. 另一个是,key先被回收,然后,在get或者set的时候,联动value的回收,key其实就是threadLocal

Java进阶(七)正确理解Thread Local的原理与适用场景
ThreadLocal源码分析
并发编程 | ThreadLocal 源码深入分析
线程的私家小院儿:ThreadLocal

ThreadLocalMap和线程的生命周期是一致的,所以线程无,则ThreadLocalMap无,threadlocal全都没了
问题是,threadLocal其实只是key,怎么保证每个线程的threadlocal都不一样呢
x

你可能感兴趣的:(ThreadLocal)