6

仮定

class A{
         private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}

A が vm 上の 1 つのクラスローダだけにロードされている場合、t1 の値は明らかです。しかし、A が 2 つの異なるクラスローダーに並んでロードされた場合、t1 はどうなりますか? 値は特定のスレッドで共有されますか?

4

2 に答える 2

7

興味深い質問です。Tom Hawtin-tacklineが説明したように、基本的に のインスタンスを作成していますThreadLocal<String>()。それでは、実際に値を格納する方法を見てみましょうThreadLocal(簡略化)。

public void set(T value) {
    ThreadLocalMap map = getMap(Thread.currentThread());
    map.set(this, value);
}

thisすべてのスレッドにバインドされ、(自分自身) をキーとして値を設定するある種のマップを使用します。ThreadLocalsこれは、 (異なるクラスローダーによって作成された) 2 つある場合、それらは異なるthis参照を持つため、異なる値を効果的に格納することを意味します。

ThreadLocal全体として、たとえば、クラスローダーのローカル シングルトンの回避策として使用したり、スレッドローカル シングルトンを作成したりすることはできません。

于 2011-02-16T18:18:16.940 に答える
4

異なるクラスローダーによってロードされたクラスは、異なるクラスです。したがって、実質的には次のものと同じです。

class A {
    private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}

class B {
    private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}
于 2011-02-16T18:12:36.187 に答える