• ThreadLocal类


    ThreadLocal

    ThreadLocal叫做线程变量,ThreadLocal提供了线程内存储变量的能力,这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过get和set方法就可以得到当前线程对应的值。
    ThreadLocal是除了加锁这种同步方式之外的另一种保证多线程访问变量时的线程安全的方法;如果每个线程对变量的访问都是基于线程自己的变量这样就不会存在线程不安全问题。

    ThreadLocal和synchronized

    `ThreadLocal`其实是与线程绑定的一个变量。ThreadLocal和Synchonized都用于解决多线程并发访问。

    ThreadLocal与synchronized有本质的区别:

    - synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离

    - synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程
    都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共
    享。而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享

    - 对于多线程资源共享的问题,同步机制采用了以时间换空间的方式,而ThreadLocal采用了以空间换时间的方式。
    前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影
    响。

     ThreadLocal应用场景

    • - 每个线程需要有自己单独的实例
    • - 实例需要在多个方法中共享,但不希望被多线程共享

    ThreadLocal实现原理

    早期版本的ThreadLocal可以理解为一个Map。当工作线程Thread实例向本地变量保持某个值时,
    会以key-value形式保存在ThreadLocal内部的Map中,其中Key为线程Thread实例,Value为待保
    存的值。当工作线程Thread实例从ThreadLocal本地变量取值时,会以Thread实例为Key,获取其
    绑定的Value。

    JDK1.8每个线程拥有一个ThreadLocalMap,ThreadLocalMap中元素Entry由key-value对组成,
    key为ThreadLocal对象,value为Object类型的值。Entry继承自WeakReference,并且在Entry
    构造函数中,key也就是ThreadLocal被设置为弱引用,弱引用在垃圾回收时会被回收

    - 每个Thread线程内部都有一个Map,即ThreadLocalMap
    - Map里面存储ThreadLocal对象key和线程的变量副本value
    - Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值
    - 对于不同的线程,每次获取副本值时,别的线程不能获取到当前线程的副本值,形成了副本的隔离

  • 相关阅读:
    【C++】类和对象(上)
    如何在Linux上优雅地写代码-Linux生存指南
    Kubernetes部署集群碰到的问题解决
    UI 自动化测试框架设计与 PageObject 改造!
    CrossOver22试用期到了如何免费使用?
    01 HTTP协议相关
    每日OJ题_多源BFS①_力扣542. 01 矩阵(多源BFS解决最短路原理)
    【leetcode】【剑指offer Ⅱ】058. 日程表
    【测试沉思录】17. 性能测试中的系统资源分析之四:网络
    热门项目披露:湖南民航置业有限公司70%股权转让
  • 原文地址:https://blog.csdn.net/weixin_50518344/article/details/126787464