假设
class A{
private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}
如果 A 仅在 vm 上的一个类加载器中加载,则 t1 的值是显而易见的。但是如果 A 在两个不同的类加载器中并排加载,t1 会发生什么?是否会为给定线程共享该值?
假设
class A{
private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}
如果 A 仅在 vm 上的一个类加载器中加载,则 t1 的值是显而易见的。但是如果 A 在两个不同的类加载器中并排加载,t1 会发生什么?是否会为给定线程共享该值?
有趣的问题。正如Tom Hawtin-tackline解释的那样,您基本上是在创建ThreadLocal<String>()
. 现在让我们看看ThreadLocal
实际如何存储值(简化):
public void set(T value) {
ThreadLocalMap map = getMap(Thread.currentThread());
map.set(this, value);
}
它需要某种绑定到每个线程的映射,并使用this
(我自己)作为键来设置值。这意味着如果你有两个ThreadLocals
(由不同的类加载器创建),它们有不同的this
引用,从而有效地存储不同的值。
总而言之-您不能例如ThreadLocal
用作类加载器本地单例和创建线程本地单例的解决方法。
不同类加载器加载的类是不同的类。所以它实际上与拥有相同:
class A {
private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}
class B {
private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}