考虑单身人士:
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问题的线程安全解决方案?
答案 0 :(得分:5)
我没有放任何锁,但为什么这是一个线程安全的解决方案 单身人士问题?
因为类变量在初始化声明类时初始化,并且在锁后面初始化类。该过程在Java语言规范的Detailed Initialization Procedure章节中描述。
当您的客户端代码调用getInstance
时,相应的线程将尝试访问Nested.INSTANCE
。如果Nested
尚未初始化,则当前线程将获取该类的初始化锁并对其进行初始化。部分初始化过程将初始化final
类字段INSTANCE
。
请注意,在您提供的示例中,让Nested
类成为INSTANCE
的持有者没有意义,您可能在MySingleton
中拥有该字段类。