ThreadLocal 中有一个内部类 ThreadLocalMap ,ThreadLocalMap 是一个Hash结构,而它的健值对是 ThreadLocal/value
我们执行ThreadLocal中的get 方法时,可以得到当前线程中的对象,那么它是怎么得到呢?
这样我们得先来看一下 Thread 类的东东,打开Thread 类,看见它有这样一个属性:ThreadLocal.ThreadLocalMap threadLocals = null;
每个线程中都有ThreadLocalMap,当我们执行ThreadLocal对象中的 get() 方法时、它会先得到当前的线程,然后取出当前线程中的ThreadLocalMap 对象,而这个ThreadLocalMap 是一个映射,它的Key 是以ThreadLocal对象为
Key,value则是我们希望当前线程保存的值,既然操作的都是ThreadLocalMap,那么ThreadLocal对象起到一个什么作用呢?
我们所希望的是ThreadLocal对象执行get()方法返回的是当前线程中保存的的值,好多线程共同操作它,它是怎么区分线程之间的,这个很简单,因为ThreadLocal操作的都是
Thread 对象中的ThreadLocalMap 对象,这样每个线程的值当前不一样,更不会互相影响,其实到这里已经可以做到线程之间的互不影响,而这个MAP的类型为什么要是<ThreadLoca,Object>
的形式,而不直接是一个Object,虽然直接是一个Object也能完成线程之间的共享,但如果有多个ThreadLocal对象,那么ThreadLocalMap中的Object 到底要保存哪个ThreadLocal对象中的
值,这就必须要使 Thread 中的 的引用是一个集合,要想使某个ThreadLocal 对象快速定位到它在ThreadLocalMap 中对应的值,就注定要使用Map,而这个Map则是以ThreadLocal为键值
在我们执行ThreadLocal.get()当前线程值的意思就是:
在当前线程中的ThreadLocalMap中给我取出 这个ThreadLocal对象对应的值,
因此在使用的时候,我们可以定义一个公共的ThreadLocal来保存线程之间的值,因为ThreadLocal只是Thread中的Map 的一个映射,取值则是从当前Thread中Map取出来的
和ThreadLocal对象没有啥关系的
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t); //返回当前线程中的ThreadLocalMap
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
我们执行ThreadLocal中的get 方法时,可以得到当前线程中的对象,那么它是怎么得到呢?
这样我们得先来看一下 Thread 类的东东,打开Thread 类,看见它有这样一个属性:ThreadLocal.ThreadLocalMap threadLocals = null;
每个线程中都有ThreadLocalMap,当我们执行ThreadLocal对象中的 get() 方法时、它会先得到当前的线程,然后取出当前线程中的ThreadLocalMap 对象,而这个ThreadLocalMap 是一个映射,它的Key 是以ThreadLocal对象为
Key,value则是我们希望当前线程保存的值,既然操作的都是ThreadLocalMap,那么ThreadLocal对象起到一个什么作用呢?
我们所希望的是ThreadLocal对象执行get()方法返回的是当前线程中保存的的值,好多线程共同操作它,它是怎么区分线程之间的,这个很简单,因为ThreadLocal操作的都是
Thread 对象中的ThreadLocalMap 对象,这样每个线程的值当前不一样,更不会互相影响,其实到这里已经可以做到线程之间的互不影响,而这个MAP的类型为什么要是<ThreadLoca,Object>
的形式,而不直接是一个Object,虽然直接是一个Object也能完成线程之间的共享,但如果有多个ThreadLocal对象,那么ThreadLocalMap中的Object 到底要保存哪个ThreadLocal对象中的
值,这就必须要使 Thread 中的 的引用是一个集合,要想使某个ThreadLocal 对象快速定位到它在ThreadLocalMap 中对应的值,就注定要使用Map,而这个Map则是以ThreadLocal为键值
在我们执行ThreadLocal.get()当前线程值的意思就是:
在当前线程中的ThreadLocalMap中给我取出 这个ThreadLocal对象对应的值,
因此在使用的时候,我们可以定义一个公共的ThreadLocal来保存线程之间的值,因为ThreadLocal只是Thread中的Map 的一个映射,取值则是从当前Thread中Map取出来的
和ThreadLocal对象没有啥关系的
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t); //返回当前线程中的ThreadLocalMap
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}