这个Singleton是一个线程安全吗?我怎么看?

时间:2015-09-11 14:48:20

标签: java 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;
    }
}

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

1 个答案:

答案 0 :(得分:5)

  

我没有放任何锁,但为什么这是一个线程安全的解决方案   单身人士问题?

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

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

请注意,在您提供的示例中,让Nested类成为INSTANCE的持有者没有意义,您可能在MySingleton中拥有该字段类。

相关问题