美文网首页
ThreadLocal的原理和使用场景

ThreadLocal的原理和使用场景

作者: 菜鸟养成记 | 来源:发表于2021-08-10 08:13 被阅读0次

每一个Thread对象均含有一个ThreadLocalMap类型的成员变量ThreadLocals,它存储本线程中所有ThreadLocal对象及其对应的值
ThreadLocal由一个个Entry对象构成

Entry继承自WeakReference<ThreadLocal<?>>,一个Entry由ThreadLocal对象和Object构成,由此可见,Entry的key是ThreadLocal对象,并且是一个弱引用。当没指向key的强引用后,该key就会被垃圾回收器回收

当执行set方法时,ThreadLocal首先会获取当前线程对象,然后获取当前线程的ThreadLocalMap对象,再以当前ThreadLocal对象为key,将值存储进ThreadLocal对象中。

get方法执行过程类似。ThreadLocal首先会获取当前线程对象,然后获取当前线程的ThreadLocalMap对象,再以当前ThreadLocal对象为key,获取对应的value。

由于每一条线程均含有各自私有的ThreadLocalMap容器,这些容器相互独立互不影响,因此不会存在线程安全性问题,从而也无需使用同步机制来保证多条线程访问容器的互斥性。

使用场景:

  1. 在使用对象跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束;
  2. 线程间数据隔离
  3. 进行事务操作,用于存储线程事务信息;
  4. 数据库连接,session会话处理。

spring框架在事务开始的时候会给当前线程绑定一个jdbc Connection,在整个事务过程中都是使用该线程绑定的connection来执行数据库操作,实现的事务的隔离性。spring框架里面就是用的ThreadLocal来实现这种隔离

相关文章

网友评论

      本文标题:ThreadLocal的原理和使用场景

      本文链接:https://www.haomeiwen.com/subject/rmwtbltx.html