ThreadLocal实现原理简述

ThreadLocal实现原理简述

  • ThreadLocal是什么
  • 数据结构
  • 内存溢出
  • 参考资料

ThreadLocal是什么

ThreadLocal是一个线程内共享变量工具类。 将线程与该线程存放的对象做一个映射,各个线程之间的变量互不干扰。适用于各个线程依赖不同的变量值完成操作的场景,如:Spring声明式数据库事务、shiro的session

数据结构

ThreadLocal内部结构

ThreadLocal实现原理简述_第1张图片

核心机制:
1.每个线程实例中有个threadlocals属性,实际上是个map
2.这个Map中存放的是ThreadLocal实例和Threadlocal实例在该线程中共享的值(value)
3.线程中的Map有ThreadLocal实例维护,由ThreadLocal实例向map中设置和获取值。
3.1 设置值
ThreadLocal实例通过Thread.currentThread获得当前线程实例,自身为key,待设置的值为value组成Entry,放入当前线程实例的map中。
3.2 获取值
ThreadLocal实例通过Thread.currentThread获得当前线程实例,在map中以自身为key,获得对应的value。

从上面的机制中确保threadlocal设置的值,仅在设置时的线程中共享,其它线程无法访问到该线程中设置的值。确保了,1、线程间变量隔离,2、线程内能访问。

内存溢出

当线程实例的生命周期短于ThreadLocal实例的生命周期,threadLocal内存的回收,取决于threadLocal实例的生命周期。而,当线程实例的生命周期长于ThreadLocal实例的生命周期(一般线程池场景)时,thread中ThreadLocalMap的每个Entry的key(对threadLocal的弱引用),在gc时会被回收;然而,Entry中value(强引用)是不会回收。当我们使用ThreadLocal的set方法,要配套进行remove,确保value能及时回收。

参考资料

ThreadLocal-面试必问深度解析

你可能感兴趣的:(ThreadLocal实现原理简述)