其他分享
首页 > 其他分享> > JDK-ThreadLocal的理解与解读

JDK-ThreadLocal的理解与解读

作者:互联网

前言:关于ThreadLocal,JDK文档中解释得有些晦涩,这几天看一个培训视频正好用到了该类,很多的弹幕兄弟也没整明白这是个啥,所以写篇文章谈下我对这个类的理解。


先上官方文档的中文解释:

      这个类提供线程局部变量。 这些变量与其正常的对应方式不同,因为访问一个的每个线程(通过其get或set方法)都有自己独立初始化的变量副本。 ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段(例如,用户ID或事务ID)。

个人解读:

      首先,这个类的主要作用,是为每个线程提供一个专属于该线程的内存空间,这个内存空间是加密的,只有该线程才能访问该内存空间中的数据。所以这个类存在的目的,就是为了解决多线程存在的数据安全问题

关于这个类的特点,总结如下:
  1. ThreadLocal 可以为当前线程关联一个数据。(它可以像 Map 一样存取数据,key 为当前线程)
  2. 每一个 ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要使用多个 ThreadLocal 对象实例。
  3. 每个 ThreadLocal 对象实例定义的时候,一般都是 static 类型。
  4. ThreadLocal 中保存数据,在线程销毁后,会由 JVM 虚拟机自动释放。
现对该类的特点,做一个解读:

      首先,做个类比,一个ThreadLocal实例化对象,就相当于是我们去超市的时候,门口的那一个“人脸识别式”的电子储物柜。

       然后呢,每个去超市的人,都是一个线程。

      接着,我们开始通过超市电子储物柜,理解这个ThreadLocal。

      以上呢,就是我个人对ThreadLocal这个类的理解与解读,总的来说,一个ThreadLocal实例化对象,就相当于是一个超市的电子储物柜。一个超市可以有多个电子储物柜,所以我们的一个类中,也可以实例化多个ThreadLocal对象。 专业点来说,这个ThreadLocal对象,就是一个"线程域"。专门给每个线程存取自己的数据用的。


      谈完了我个人对ThreadLocal类的作用的理解,再谈另一个问题,是关于ThreadLocal的底层实现,它是通过什么数据结构实现这种功能的呢?
       其实呢,通过它的源码,可以看出它的底层其实是用了一个类似Map的结构。并且这个Map呢,与众不同的地方在于,它是一个线程安全的Map,可以想象成底层是Hashtable或ConcurrentHashMap。
       那么,为什么要用线程安全的Map呢?它又有什么作用呢?
       理由呢,很简单。首先,使用线程安全的Map,可以防止高并发的时候,多个线程同时存储数据时,可能占用了Map的同一个bucket位置(也就是Map底层数组的位置)。也就是说,当多个人同时准备去超市的储物柜存放东西的时候,人脸识别机器每次只能识别一张脸,打开一个柜子给顾客,如果这时候多个人拥上去同时刷脸,那么可能会导致打开一个柜子,却不知道是哪个顾客的脸刷出来的。所以我们就会发现,如果生活中多个人需要刷脸开柜子了,最好的处理方式就是大家排好队,一个一个刷脸,然后打开自己的专属柜子来存储物品,对吧?同样的道理,当多个线程同时需要往ThreadLocal中存储自己的数据时,使用线程安全的Map,那么同一时刻只允许一个线程操作该Map,也就是同一时刻只允许一个线程往该Map中存储数据,就不会导致数据混乱啦。


好了,以上就是我个人对JDK中的ThreadLocal这个类的解读了,如果有什么不恰当的地方,还望各位兄弟在评论区指出哦。
如果这篇文章对你有帮助的话,不妨点个关注吧~
期待下次我们共同讨论,一起进步哇~

标签:Map,柜子,JDK,储物柜,超市,解读,ThreadLocal,线程
来源: https://blog.csdn.net/qq_43719791/article/details/120534833