ThreadLocalの原理を徹底的に理解する

5406 ワード

最近夏休みの実習を探して、Javaの同時プログラミングの芸術のこの本を読んで、前のJMMについての部分はやはりとても難しくて、第4章を見て、ついに同時テーマに入りました.いきなりThreadLocalというクラスが現れて、思い出してみると、前にこのクラスを使ったことがあり、ThreadLocalで保存した値は、現在のスレッドでしか見えません.

以下、その実現原理を紹介する。


まず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に格納されます.