ThreadLocalの原理を徹底的に理解する
5406 ワード
最近夏休みの実習を探して、Javaの同時プログラミングの芸術のこの本を読んで、前のJMMについての部分はやはりとても難しくて、第4章を見て、ついに同時テーマに入りました.いきなりThreadLocalというクラスが現れて、思い出してみると、前にこのクラスを使ったことがあり、ThreadLocalで保存した値は、現在のスレッドでしか見えません.
まずThreadLocalクラスに入り、set()メソッドのソースコードを観察します.
まず、現在のスレッドtを取得し、getMap(t)を呼び出し、ThreadLocalMapオブジェクトを取得し、getMap()メソッドを追跡し続ける
getMapメソッドはtスレッドのthreadLocals属性を返してThreadクラスに入る
threadLocalsのデフォルトはnullなので、setメソッドはcreateMapメソッドを呼び出します.
createMapメソッドでは、keyが現在のThreadLocalMapオブジェクトであり、このThreadLocalMapオブジェクトが現在のThreadLocalオブジェクトであることがわかります.
これで、各スレッドにはThreadLocalMapプロパティがあり、現在のスレッドがThreadLocalオブジェクトを作成した後、setメソッドを呼び出し、キーとしてThreadLocalMapに格納されます.
以下、その実現原理を紹介する。
まずThreadLocalクラスに入り、set()メソッドのソースコードを観察します.
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
まず、現在のスレッドtを取得し、getMap(t)を呼び出し、ThreadLocalMapオブジェクトを取得し、getMap()メソッドを追跡し続ける
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
getMapメソッドはtスレッドのthreadLocals属性を返してThreadクラスに入る
ThreadLocal.ThreadLocalMap threadLocals = null;
threadLocalsのデフォルトはnullなので、setメソッドはcreateMapメソッドを呼び出します.
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
table = new Entry[INITIAL_CAPACITY];
int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
table[i] = new Entry(firstKey, firstValue);
size = 1;
setThreshold(INITIAL_CAPACITY);
}
createMapメソッドでは、keyが現在のThreadLocalMapオブジェクトであり、このThreadLocalMapオブジェクトが現在のThreadLocalオブジェクトであることがわかります.
結論
これで、各スレッドにはThreadLocalMapプロパティがあり、現在のスレッドがThreadLocalオブジェクトを作成した後、setメソッドを呼び出し、キーとしてThreadLocalMapに格納されます.