zoukankan      html  css  js  c++  java
  • ThreadLocal的原理和使用场景

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

    ThreadLocalMap是由一个个Entry对象构成,Entry继承自WeakReference,一个Entry是由ThreadLocal对象和Object(这里是程序员存入的值)构成。由此可见Entry的key是一个ThreadLocal对象,并且是一个弱引用(防止内存泄漏)。当没有key的强引用后,该key就会被垃圾回收器回收。

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

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

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

    使用场景:

    • 在进行对象跨层传输时,使用ThreadLocal可以避免多次传递,打破层次间的约束性
    • 线程间数据隔离
    • 进行事务操作,用于存储线程事务信息。
    • 数据库连接,Session会话管理。

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

  • 相关阅读:
    HDU 4452 模拟
    CSUFT2016ACM训练赛4
    HDU 4445 纯物理题+枚举
    HDU 4442 排队贪心
    2016中国大学生程序设计竞赛
    POJ 2239 化二分图右集合二维为一位的最大匹配
    学习数据库必须掌握的54条SQL查询语句
    jsp+连接MYSQL5.1
    查看MYSQL 端口
    J2EE+struts2+helloworld调试问题解决方法
  • 原文地址:https://www.cnblogs.com/liuzhidao/p/14789565.html
Copyright © 2011-2022 走看看