ThreadLocal的原理
来源:互联网 发布:json在线编辑器 编辑:程序博客网 时间:2024/06/06 09:35
在多线程环境下,会使用ThreadLocal来保存变量,这样即使在多线程的环境下,也能够以线程安全的方式来使用变量。
1、在多线程环境中,使用ThreadLocal来保存变量时,变量是存在什么地方?
简要来说,使用ThreadLocal来保存相关变量时,这个变量是存在当前使用ThreadLocal对象的这个线程中的,也就是当前线程,即Thread.currentThread()返回的线程中
2、ThreadLocal的实现原理
要说明ThreadLocal的实现原理,先需要说明几个相关的类ThreadLocal.ThreadLocalMap(ThreadLocal的静态内部类),以及ThreadLocal.ThreadLocalMap.Entry(ThreadLocalMap的静态内部类)。
每个Entry就是一个存储的变量信息,类定义如下
staticclassEntryextendsWeakReference<ThreadLocal> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal k, Object v) {
super(k);
value = v;
}
}
在Entry中进行存储时,以保存这个变量的ThreadLocal为key,以要保存的变量为value。
而ThreadLocalMap则是使用一个Entry数组,来进行信息的存储。所以,简单说来,我们存储的变量,最后是转成了一个个的Entry对象,由一个ThreadLocalMap对象来进行管理。下面是ThreadLocalMap的属性定义。
staticclassThreadLocalMap {
/**
* The initial capacity--MUST be a power of two.
*/
privatestaticfinalintINITIAL_CAPACITY = 16;
/**
* The table, resized as necessary.
* table.length MUST always be a power of two.
*/
privateEntry[] table;
/**
* The number of entries in the table.
*/
privateintsize = 0;
/**
* The next size value at which to resize.
*/
privateintthreshold;// Default to 0
/**
xxxxxxx
*/
}
还有一个和ThreadLocal使用相关的是Thread类的一个属性threadLocals,这个属性的定义如下ThreadLocal.ThreadLocalMap threadLocals =null;
到此,相关的基础类型就都已经定义出来了。
下面来看下ThreadLocal的设置属性的方法,在ThreadLocal中,通过将以上这些基础类进行组装,来完成了相应的功能
publicvoidset(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if(map !=null)
map.set(this, value);
else
createMap(t, value);
}
获取了当前的线程,然后获取这个类的ThreadLocalMap对象
ThreadLocalMapgetMap (Thread t) {
returnt.threadLocals;
}
将数据保存到这个ThreadLocalMap对象中,也就是保存到了当前线程中。所以,简单来说,数据是保存在了当前线程中。
0 0
- ThreadLocal的工作原理
- ThreadLocal的原理
- ThreadLocal的实现原理
- ThreadLocal的实现原理
- ThreadLocal的原理
- ThreadLocal类的工作原理
- ThreadLocal 的应用及原理
- ThreadLocal的使用与原理
- 大白话讲解ThreadLocal的原理
- 源码|ThreadLocal的实现原理
- ThreadLocal 原理
- ThreadLocal原理
- ThreadLocal原理
- ThreadLocal原理
- ThreadLocal原理
- ThreadLocal 原理
- ThreadLocal原理
- ThreadLocal保证线程安全的原理
- 工作半年,总结分享
- 9.原型模式
- Linux命令之file命令 待续版
- day17
- PAT (Advanced Level) Practise 1029 Median (25)
- ThreadLocal的原理
- TOYS(水解析)
- Python使用mechanize模拟登录、抓取数据的代码
- Delphi IDHTTP用法详解
- 12.3.19 fields ——elasticsearch中文文档
- C++Const
- 小算法:获得一个数的所有可能性组合
- fresco解析之Hierarchy
- UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-78: ordinal not in range(128