线程安全在Java中实现单例模式的有效方法?

Pra*_*eep 10 java singleton synchronized thread-safety

可能重复:
在Java中实现单例模式的有效方法

我正在阅读这篇关于Java的最佳单例实现,但它不是线程安全的.

根据维基:

if(singleton==null) { synchronized(Singleton.class) { // this is needed if two threads are waiting at the monitor at the // time when singleton was getting instantiated if(singleton==null) singleton= new Singleton(); }
}

但是Find Bugs实用程序在此中给出了两个错误:1.双重空检查.2.静态字段的延迟初始化不正确.

什么是最好的方法,

这是对的吗 :

synchronized (Singleton.class) {
if (singleton== null) {
singleton= new Singleton();
}
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 21

使用懒惰加载Singleton的最有效/最简单的方法就是

enum Singleton {
   INSTANCE
}
Run Code Online (Sandbox Code Playgroud)

注意:不需要锁定,因为类加载是线程安全的.默认情况下,该类是final,并且不能通过反射调用构造函数.在使用INSTANCE或类之前,不会创建INSTANCE.如果您担心该类可能会被意外使用,您可以将单例包装在内部类中.

final class Singleton {
    private Singleton() { }
    static class SingletonHolder {
        static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
Run Code Online (Sandbox Code Playgroud)

恕我直言,你必须非常偏执才能认为这是一个更好的解决方案.