这个Singleton是一个线程安全吗?我看不出来怎么样?

JAN*_*JAN 0 java singleton multithreading thread-safety

考虑Singleton:

public final class MySingleton {
    private static class Nested 
    {
        private static final MySingleton INSTANCE = new MySingleton();
    }

    private MySingleton() 
    {
        if (Nested.INSTANCE != null) 
        {
            throw new IllegalStateException("Already instantiated");
        }
    }

    public static MySingleton getInstance() 
    {
        return Nested.INSTANCE;
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有放任何锁,但为什么这是Singleton问题的线程安全解决方案?

Sot*_*lis 5

我没有放任何锁,但为什么这是Singleton问题的线程安全解决方案?

因为类变量在初始化声明类时初始化,并且在锁后面初始化类.该过程在Java语言规范的详细初始化过程章节中描述.

当您的客户端代码调用时getInstance,相应的线程将尝试访问Nested.INSTANCE.如果Nested尚未初始化,则当前线程将获取该类的初始化锁并初始化它.部分初始化过程将初始化final类字段INSTANCE.

请注意,在您给出的示例中,没有必要让Nested该类成为持有者INSTANCE,您可能在MySingleton该类中拥有该字段.