• 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获取和设置线程的变量值
    - 对于不同的线程,每次获取副本值时,别的线程不能获取到当前线程的副本值,形成了副本的隔离

  • 相关阅读:
    文件系统相关知识与IO
    echarts——实现大屏数据展示——基础积累(超详细)
    ubuntu xrdp远程登录一直弹出Authentication required. System policy prevents WiFi scans
    在虚拟机安装JDK
    Qt扫描-QMoive 理论总结
    财务管理-报支单提交中和付款申请被驳回解决措施
    margin 塌陷和重合的理解
    CCES软件做开发,如果仿真器连不进目标板怎么解决?(Failed to connect to processor)
    【机器人学导论(第四版)】1-绪论
    lnmp的一键部署(脚本)
  • 原文地址:https://blog.csdn.net/weixin_50518344/article/details/126787464