-- 最近再探Spring,深入研究了一下Spring的Introduce Advice。其中涉及到了关于ThreadLocal的一些内容,回顾了一下,这里做个记录。
-- Java DOC说ThreadLocal存储了一个线程的局部变量,内部究竟是怎样的。具体如下:
-- Thread中维护了一个ThreadLocal.ThreadLocalMap的变量。
ThreadLocal.ThreadLocalMap threadLocals = null;
-- 当我们调用ThreadLocal的set方法的时候,实际上是往Thread.currentThread()也就是当前线程的ThreadLocalMap变量中添加数据。
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
-- 由此可见,一个Thread可以维护多个ThreadLocal
-- 再看ThreadLocal.ThreadLocalMap(ThreadLocalMap是ThreadLocal的静态内部类,为了方便,下面简写为ThreadLocalMap)
ThreadLocalMap是不是像他名字所写的那样使用了一个Map来储存一个Thread的局部变量呢?答案是否定的。
private Entry[] table;
实际上它用的是一个ThreadLocalMap.Entry数组。这个数组的初始容量为16.
private static final int INITIAL_CAPACITY = 16;
-- Entry是ThreadLocalMap静态内部类。下面简写为Entry。
-- 那么又是如何往Entry[ ]中添加数据呢?
private void set(ThreadLocal key, Object value) {
Entry[] tab = table;
int len = tab.length;
int i = key.threadLocalHashCode & (len-1);
for (Entry e = tab[i];
e != null;
e = tab[i = nextIndex(i, len)]) {
ThreadLocal k = e.get();
if (k == key) {
e.value = value;
return;
}
if (k == null) {
replaceStaleEntry(key, value, i);
return;
}
}
tab[i] = new Entry(key, value);
int sz = ++size;
if (!cleanSomeSlots(i, sz) && sz >= threshold)
rehash();
}
-- 这里使用了ThreadLocal的threadLocalHashCode与16进制的F做与操作的结果作为索引来向Entry数组添加数据。上面判断是否已经使用当前TheadLocal添加了数据,下面对数组越界做处理。具体怎么处理的,时间所限没有深究。
-- 至于Entry本质上就是一个没有存取器的Java Bean。它有两个属性:
ThreadLocal类型的key,
Object类型的Value
分享到:
相关推荐
入研究java.lang.ThreadLocal类.docx
正确理解ThreadLocal.pdf
ThreadLocal
本地学习练习demo的eclipse工作空间:主要包括多线程的相关demo以及quartz调度的简单实现和其他java基础的demo练习
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
我们可以看到,通过这段代码实例化了一个ThreadLocal对象。我们只需要实例化对象一次,并且也不需要知道它是被哪个线程实例化。虽然所有的线程都能访问到这个ThreadLocal实例,但是每个线程却只能访问到自己通过调用...
通过ThreadLocal对象定位到线程:Thread.currentThread()通过ThreadLocal对象拿到所在的ThreadLocalMap: T
解析源码内容,包括threadlocalmap中怎么解决hash冲突,以及set时得各种场景,还有set时什么条件会触发扩容机制,并且说明在过期桶中为什么要清除这些数据信息。
JAVA并发-自问自答学ThreadLocal
threadlocal源码解析
《ThreadLocal究竟是个啥?》案例代码,讲述了ThreadLocal的概念使用,解答了ThreadLocal在父子线程中通信问题。
多线程可以同时运行多个任务但是当多个线程同时访问共享数据时,可能导致数据不同步,甚至错误!线程锁主要用来给方法、代码块加锁
什么是ThreadLocal .
Synchronized与ThreadLocal
通常情况下,我们创建的成员变量都是线程不安全的。因为他可能被多个线程同时修改,此变量对于多...而使用ThreadLocal创建的变量只能被当前线程访问,其他线程无法访问和修改。也就是说:将线程公有化变成线程私有化。
ThreadLocal 用法详解.md
TextMessage msg = session.createTextMessage(Thread.currentThread().getName()+ "productor:我是大帅哥,我现在正在生产东西!,count:"+num); System.out.println(Thread.currentThread().getName()+ ...
Java并发编实践之ThreadLocal变量.doc
关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. ...