这是确保Java中只存在一个对象的单个实例的有效方法吗?

wfb*_*ale 3 java singleton

我在Mongodb中遇到了一些奇怪的错误,在Mongodb中,你应该使用Mongo单身人士.我只是想确保这是非常有效的.

public class DBManager {
    public static Mongo mongoSingleton = null;

    public static synchronized void getMongo(){
         if(mongoSingleton == null){
              mongoSingleton = new Mongo();
         }
         return mongoSingleton;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

pba*_*ris 6

您必须将您的公共成员mongoSingleton设置为私有并隐藏默认构造函数

所以

private static Mongo mongoSingleton = null;

private Mongo() {

}
Run Code Online (Sandbox Code Playgroud)

Mongo类的实现

public class Mongo {
    private static volatile Mongo instance;
    private Mongo() {
        ...
    }

    public static Mongo getInstance() {
        if (instance == null) {
            synchronized (Mongo.class) {
                if (instance == null) { // yes double check
                    instance = new Mongo();
                }
            }
        }

        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

Mongo.getInstance();
Run Code Online (Sandbox Code Playgroud)

  • @ LINEMAN78:嗯,这是一本经典的教科书单例,但它绝对不是实现它的唯一方法,实际上也不是最好的方法. (2认同)

小智 5

这是典型的Singleton模式,但Java中的首选方法是创建一个Enum:

public enum DBManager {
    INSTANCE;

    // implementation here
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过以下方式引用实例:

DBManager.INSTANCE
Run Code Online (Sandbox Code Playgroud)

请注意,在任何一种情况下(枚举或单例模式),结果是每个ClassLoader一个实例,而不是每个JVM.