ThreadLocals的效果和并行类加载

时间:2011-02-16 17:37:55

标签: java classloader thread-local

假设

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

如果A只在vm上的一个类加载器中加载,则t1的值很明显。但是如果A在两个不同的类加载器中并排加载,t1会发生什么?是否会为给定的线程共享该值?

2 个答案:

答案 0 :(得分:6)

有趣的问题。正如 Tom Hawtin - tackline 所解释的那样,您基本上是在创建ThreadLocal<String>()的实例。现在让我们看看ThreadLocal如何实际存储值(简化):

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

它需要某种绑定到每个线程的映射,并使用this(我自己)作为键来设置值。这意味着如果您有两个ThreadLocals(由不同的类加载器创建),它们具有不同的this引用,从而有效地存储不同的值。

总而言之 - 你不能,例如使用ThreadLocal作为类加载器本地单例的一种解决方法,并创建线程本地单例。

答案 1 :(得分:4)

由不同类加载器加载的类是不同的类。所以它实际上和以下一样:

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

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