Threadsafe Singleton没有Java同步?

Min*_*ock 7 java singleton multithreading double-checked-locking

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

public final class Singleton {

    private static MyClass mc;

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

}
Run Code Online (Sandbox Code Playgroud)

当然,这在一般的多线程场景中不起作用.但请考虑以下情形:

  • 一开始只有一个线程
  • 这一个线程getInstance()第一次调用,以便初始化mc.
  • 之后,所有其他线程由第一个线程启动.

我的假设:

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

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

Voo*_*Voo 5

你的分析确实很好.

确切地说:在一个线程上发生的所有事情都会在关系之前发生(很明显,就是这样说:"如果x和y是同一个线程的动作而x在程序顺序中出现在y之前,那么hb(x, y).")

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

"在启动线程中的任何操作之前,对线程的start()调用发生."

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

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