zoukankan      html  css  js  c++  java
  • Java中的ThreadLocal

    本文记录了一些关于ThreadLocal相关的个人理解

    1.Thread,ThreadLocal,ThreadLocalMap三者的关系?

     上面的代码是Thread类的源码,Thread类有一个实例变量,名叫threadLocals,它是ThreadLocalMap类型,同时它又是ThreadLocal的静态类。也就是说,每一个线程都有一个ThreadLocalMap,这个类实现的功能其实就是一个哈希表

    ThreadLocal类中,提供了一系列操作,如get,set,remove等,这些操作全部是在线程的ThreadLocalMap上进行的,换句话说,存储数据的是Thread类中的ThreadLocalMap,操作数据的是ThreadLocal,ThreadLocal本身并不存储数据

     比如get操作,通过getMap来获取当前运行线程的threadLocals(变量的类型为ThreadLocalMap,也就是上面提到的存储数据的哈希表)。

    注意到map.getEntry(this)中传入了this指针,也就是当前ThreadLocal实例的引用,因此除了操作数据之外,ThreadLocal的另一个作用是提供hash地址

    ThreadLocalMap getMap(Thread t) {
            return t.threadLocals;
        }

     

     2.ThreadLocal如何保证不同线程存取的是某个线程自己的本地数据?

    ThreadLocal的地址是不变的,变的是不同线程的ThreadLocalMap,因此在存取的过程中,对于同一个ThreadLocal,不同线程的ThreadLocalMap用相同的Key(同一个ThreadLocal的引用)存取到了不同的值(各自的Value)

    具体细节推荐看这里   https://zhuanlan.zhihu.com/p/61587053

  • 相关阅读:
    linux学习笔记2-命令总结2
    Hbase项目(完整版)
    hbase的优化(全)
    hbase读写流程
    Hbase出现ERROR: Can't get master address from ZooKeeper; znode data == null解决办法
    hbase的命令
    快照原理
    xshell同时发送多条命令
    配置NTP集群时间同步(二)
    配置 NTP 时间服务器
  • 原文地址:https://www.cnblogs.com/gagag/p/14501843.html
Copyright © 2011-2022 走看看