ThreadLocal数据结构
时间: 2023-11-16 21:57:54 浏览: 90
ThreadLocal是Java中的一个线程局部变量,它可以为每个线程存储一个值,而这个值对于其他线程来说是不可见的。ThreadLocal的实现依赖于ThreadLocalMap这个数据结构,每个ThreadLocal对象都有一个对应的ThreadLocalMap实例,而ThreadLocalMap内部则是由Entry数组实现的。每个Entry对象都包含了一个对应的ThreadLocal对象和一个value值,这个value值就是我们存储在ThreadLocal中的值。当我们调用ThreadLocal的get()方法时,实际上是通过当前线程的ThreadLocalMap来获取对应的Entry对象,然后返回这个Entry对象的value值。同样,当我们调用ThreadLocal的set()方法时,也是通过当前线程的ThreadLocalMap来获取对应的Entry对象,然后将value值设置到这个Entry对象中。需要注意的是,由于ThreadLocalMap是每个线程独有的,因此不同线程之间的ThreadLocal对象是互相独立的,它们存储的值也是互相独立的。
相关问题
ThreadLocal大概结构是什么?
ThreadLocal的大概结构是由一个ThreadLocalMap类来实现的,它是ThreadLocal的内部类。ThreadLocalMap是一个键值对的数据结构,其中键是ThreadLocal对象,值是与每个线程相关联的值。每个线程都有一个threadLocals的成员变量,其本质就是一个ThreadLocalMap对象。ThreadLocalMap中保存了每个线程所维护的ThreadLocal对象及其对应的值。这样,每个线程可以独立地访问和修改自己的ThreadLocal对象的值,而不会对其他线程产生影响。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *3* [ThreadLocal底层原理是什么?](https://blog.csdn.net/yehongzhi1994/article/details/119718948)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* [ThreadLocal_ThreadLocal源码分析_](https://download.csdn.net/download/weixin_42666807/25851858)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
ThreadLocal源码
ThreadLocal源码是用于在每个线程中存储值的一个类。在JDK8之前,ThreadLocal的实现主要分为两部分:ThreadLocal类和ThreadLocalMap类。ThreadLocal类是一个抽象类,其中包含了一些核心方法,如get()、set()、remove()等。而ThreadLocalMap类则是ThreadLocal的内部结构,用于存储每个线程中的ThreadLocal变量和对应的值。
在每个Thread类中都维护了一个threadLocals变量,它是一个ThreadLocal.ThreadLocalMap类型的变量,用于存储当前线程中所有的ThreadLocal变量和对应的值。当我们使用ThreadLocal对象时,实际上是通过Thread类的threadLocals变量来获取和设置对应的值。
具体地说,每个ThreadLocal对象都有一个唯一的hash值,并且这个hash值被用作ThreadLocalMap的下标。在ThreadLocalMap中使用数组来存储ThreadLocal对象和对应的值。这样一来,一个线程中可以设置多个ThreadLocal对象,并且每个ThreadLocal对象都可以独立地存储和获取值。
总结起来,ThreadLocal源码的主要作用是为每个线程提供一个独立的存储空间,用于存储线程私有的值。通过ThreadLocal类和ThreadLocalMap类的配合,我们可以方便地在多线程环境下实现线程安全的数据共享。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [ThreadLocal_ThreadLocal源码分析_](https://download.csdn.net/download/weixin_42666807/25851858)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *2* [【源码篇】threadlocal源码超详细讲解](https://blog.csdn.net/qq_21046665/article/details/124211071)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *3* [ThreadLocal源码深度详解](https://blog.csdn.net/A_art_xiang/article/details/131224830)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
[ .reference_list ]
阅读全文