正如标题所说,为什么静态嵌套类单例线程安全?
public class Singleton
{
private static class SingletonHolder
{
public static Singleton instance = null;
public static Singleton getInstance(){
if (null == instance) {
instance = new Singleton();
}
}
}
public static Singleton getInstance()
{
return SingletonHolder.getInstance();
}
}
答案 0 :(得分:22)
您显示的代码在技术上不是线程安全的。这种狡猾的代码经常会被破坏。
代码应如下所示:
public class Singleton {
private static class SingletonHolder {
public static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
这里我们在静态初始化程序(SingletonHolder
)中进行分配,任何线程都可以通过正确的发生在之前的关系来查看它。嵌套类没有什么特别之处,它只允许在不立即构造单例对象的情况下使用外部类。几乎可以肯定,这完全是毫无意义,但它似乎取悦了一些人。
一如既往[可变]单身人士是非常糟糕的想法。
答案 1 :(得分:6)
它是线程安全的,因为JVM处理延迟加载嵌套类。
但是,您发布的代码似乎没有正确使用此模式(您不应该进行空检查),我认为这实际上打破了线程的安全性。这是一篇很好的文章,您可以在其中详细了解此模式的工作原理以及如何正确使用它: