gpt4 book ai didi

java - Java 中没有同步的线程安全单例?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:27:35 25 4
gpt4 key购买 nike

我有一个多线程应用程序和一个单例类:

public final class Singleton {

private static MyClass mc;

public static final Object getInstance() {
if(mc == null) {
mc = new MyClass();
}
return mc;
}

}

当然,这在一般的多线程场景下是行不通的。但请考虑以下情况:

  • 一开始只有一个线程
  • 该线程第一次调用getInstance(),使mc初始化。
  • 之后所有其他线程都由第一个线程启动。

我的假设:

这应该可行,因为 mc 字段的初始化和对象的构造发生在启动其他线程的所有后续 Thread.start() 调用之前.并且线程的 Thread.start() 发生在该线程的所有其他操作之前。因此 mc 的初始化发生在所有其他线程中的所有操作之前,以便 getInstance() 将为所有线程返回正确的值。

这个假设对吗?为什么/为什么不?

最佳答案

您的分析确实非常好。

准确地说:在一个线程上顺序发生的所有事情都具有发生在关系之前的关系(显然,是这样说的:“如果 x 和 y 是同一线程的操作,并且 x 在程序顺序中出现在 y 之前,那么 hb (x,y)。”)

JLS 的 17.4.5 然后继续说以下内容:

“线程上对 start() 的调用发生在已启动线程中的任何操作之前。”

所以综合来看,在单例实例化和启动的线程之间有一个明确的发生在顺序之前,因此可以保证它们看到最新的值。

简单地说:创建的线程保证可以看到其父线程在创建之前所做的一切,否则并发编程几乎是不可能的。

关于java - Java 中没有同步的线程安全单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26790059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com