ThreadLocals 和并行类加载的效果

发布于 2024-10-17 17:18:16 字数 232 浏览 2 评论 0原文

假设

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

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

Assuming

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

If A is loaded in just one classloader on the vm, the value of t1 is obvious. But what happens to t1 if A is loaded side-by-side in two different classloaders ? Will the value be shared for a given thread ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

染年凉城似染瑾 2024-10-24 17:18:16

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

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

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

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

Interesting question. As Tom Hawtin - tackline explained, you are basically creating to instances of ThreadLocal<String>(). Now let's have a look at how ThreadLocal actually stores the values (simplified):

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

It takes some sort of a map that is bound to every thread and sets the value using this (myself) as a key. This means that if you have two ThreadLocals (created by different class loaders), they have different this reference, thus effectively storing different values.

All in all - you cannot e.g. use ThreadLocal as a workaround to class-loader local singletons and creating thread-local ones.

迷你仙 2024-10-24 17:18:16

不同的类加载器加载的类是不同的类。所以它实际上等同于:

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

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

Classes loaded by different class loaders are different classes. So it's effectively the same as having:

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

class B {
    private static final ThreadLocal<String> tl = new ThreadLocal<String>();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文