kro*_*old 5 java classloader thread-local
假设
class A{
private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}
Run Code Online (Sandbox Code Playgroud)
如果A只在vm上的一个类加载器中加载,则t1的值很明显.但是如果A在两个不同的类加载器中并排加载,t1会发生什么?是否会为给定的线程共享该值?
有趣的问题.正如汤姆Hawtin - tackline解释,你基本上要创建的实例ThreadLocal<String>().现在让我们看一下ThreadLocal实际存储值的方式(简化):
public void set(T value) {
ThreadLocalMap map = getMap(Thread.currentThread());
map.set(this, value);
}
Run Code Online (Sandbox Code Playgroud)
它需要某种绑定到每个线程的映射,并使用this(我自己)作为键来设置值.这意味着如果你有两个ThreadLocals(由不同的类加载器创建),它们具有不同的this引用,从而有效地存储不同的值.
总而言之 - 您不能将其ThreadLocal用作类加载器本地单例和创建线程本地单例的变通方法.
| 归档时间: |
|
| 查看次数: |
1831 次 |
| 最近记录: |