仮定
class A{
private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}
A が vm 上の 1 つのクラスローダだけにロードされている場合、t1 の値は明らかです。しかし、A が 2 つの異なるクラスローダーに並んでロードされた場合、t1 はどうなりますか? 値は特定のスレッドで共有されますか?
仮定
class A{
private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}
A が vm 上の 1 つのクラスローダだけにロードされている場合、t1 の値は明らかです。しかし、A が 2 つの異なるクラスローダーに並んでロードされた場合、t1 はどうなりますか? 値は特定のスレッドで共有されますか?
興味深い質問です。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
全体として、たとえば、クラスローダーのローカル シングルトンの回避策として使用したり、スレッドローカル シングルトンを作成したりすることはできません。
異なるクラスローダーによってロードされたクラスは、異なるクラスです。したがって、実質的には次のものと同じです。
class A {
private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}
class B {
private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}