これらは、2つの非常に基本的なクラスであり、ほとんどの場合に使用されます。今日では、グループ内の誰かが、そのことについては、方法私はそれのソースを見ました。
ここでは、単にそれをこの2つのクラス間の関係です。
私たちは、ThreadLocalのが分離され、各スレッドのマルチスレッド環境では、それぞれが独自のスレッドThradLocalのコピーを持っていることを知っています。
別の言い方をすればThreadLocalのは、マルチスレッド環境で異なる値を格納および取得することができてています。
からデータが取られる場所を確認するためにgetメソッドのThreadLocalからスタート
public class ThreadLocal<T> {
...
/**
* 这里的 getMap 方法获取存有数据的map,并且key为当前线程
*/
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
/**
* 存放数据的map对应 threadLocals 属性
*/
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
...
}
public
class Thread implements Runnable {
...
/* ThreadLocal values pertaining to this thread. This map is maintained
* by the ThreadLocal class.
* 这里看到上面 ThreadLocal 存放数据的map来自 Thread 的 threadLocals,并且该map由 ThreadLocal 维护
*/
ThreadLocal.ThreadLocalMap threadLocals = null;
...
}
ここでは、下に2つの間の関係を整理することができます:
1、スレッドがThreadLocalのに自分自身、キーのマップを持って、値がの値である
2が、ThreadLocalのは、実際に(キーとして自分自身に)現在のスレッドマップから得られた値を取得しています
ThreadLocalのは、データが実際にスレッドに配置され、各スレッドのコピーを保持するのはこのためです。