这种单例设计模式正确吗?我的意思是,当对象为静态并且方法已同步时,需要检查该对象是否为null。

public class MySingleton {

    int val = 10;
    private static final MySingleton singleton = new MySingleton();

    private MySingleton() { }

    public static synchronized MySingleton getSingleton() {
        return singleton;
    }
}

最佳答案

您无需使方法同步。在静态初始化程序中初始化变量就足够了。另外,您的val变量几乎应该是私有的...

当您不希望使用同步方法并且不希望使用静态初始化方法时,通常会使用经过双重检查的锁定模式(带有无效性检查)。 (在我看来,在几乎所有情况下,它都不必要地复杂和脆弱。)

另一种选择是使用一个枚举:

public enum MySingleton {
    INSTANCE;

    private int val = 10;

    // Presumably something to use val
}


使用枚举会增强单例性,甚至在面对序列化时也会正确无误。这也是一种非常简单的方法,不需要实际的代码:)另一方面,我从来没有觉得这是完全正确的...

10-06 07:27