【问题标题】:Effect of ThreadLocals and side-by-side classloadingThreadLocals 和并行类加载的影响
【发布时间】:2011-02-16 17:37:54
【问题描述】:

假设

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

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

【问题讨论】:

  • 每个类加载器都有它自己的类实例,因此有 2 个 t1 实例。所以2个不同。您可以通过从线程本地删除静态部分来进行实验,即每个对象可以在每个线程中看到不同的值。您可以查看类只是确保每个类加载器是单例的对象。

标签: java classloader thread-local


【解决方案1】:

有趣的问题。正如Tom Hawtin - tackline 所解释的,您基本上是在创建ThreadLocal&lt;String&gt;() 的实例。现在让我们看看ThreadLocal 实际存储值的方式(简化):

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

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

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

【讨论】:

    【解决方案2】:

    不同类加载器加载的类是不同的类。所以它实际上与拥有相同:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 2023-03-13
      相关资源
      最近更新 更多