22、ThreadLocal的原理和使用场景

ThreadLocal的原理

  • 每一个thread对象均含有一个ThreadLocalMap类型的成员变量threadLocals,它存储本线程中所有
    ThreadLocal对象及其对应的值

  • ThreadLocalMap 由一个个Entry对象构成

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

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

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

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

使用场景

  • 在进行对象跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束。

  • 线程间数据隔离

  • 进行事务操作,用于存储线程事务信息。

  • 数据库连接,Session会话管理。

Spring框架在事务开始时会给当前线程绑定一个Jdbc connection,在整个事务过程都是使用该线程绑定的connection来执行数据库操作,实现了事务的隔离性,Spring眠架里面就是用的ThreadLoca1来实现这种隔离

最后看一张图,来更加直观的了解ThreadLocal的原理
22、ThreadLocal的原理和使用场景_第1张图片
好了,ThreadLocal的原理和使用场景就介绍到这里,如果文章对您有帮助,请给文章一个点赞或收藏,如果觉得作者还不错,请给个关注,您的鼓励和支持,是我持续创作下去的动力。

你可能感兴趣的:(java,开发语言,ThreadLocal,线程,多线程,线程池,ThreadLocalMap)