ThreadLocal理解

两个作用:

  • 对资源对象的线程隔离,让每个线程各用各的资源对象,避免争用引发的线程安全问题。

  • 实现线程内资源共享

原理

  • .每个线程内都有一个ThreadLocalMap类型的成员变量,用来存储资源对象。
    1. 调用set方法,就是以ThreadLocal自己作为key,资源对象作为value,放入当前线程的ThreadLocalMap集合中。
    2. 调用get方法,就是以ThreadLocal自己作为key,到当前线程中查找关联的资源值。
    3. 调用remove方法,就是以ThreadLocal自己作为key,移除当前线程中关联的资源值。

key发生冲突怎么解决?

开放寻址法,发生冲突后,向后寻找空位置。

key为什么设计为弱引用?

Thread可能长时间运行,如果key不再使用,需要在内存不足时(GC)释放其占用的内存。
但是GC仅是让key的内存释放,后续还有根据key是否为null进一步释放值的内存,释放时机:

  • 获取key发现null,清除value,再放一个空的key上去。
  • set key时,会使用启发式扫描,清除临近的null key,启发次数与元素个数,是否发现null key 有关。
  • **remove时,**一般使用ThreadLocal时都把它作为静态变量,因此GC无法回收。
上一篇:一文了解java并发工具----------ThreadLocal


下一篇:JDK成长记11:ThreadLocal (上)