延迟初始化具有volatile变量的Singleton类

时间:2013-05-14 11:49:14

标签: java design-patterns

我遇到了一个单例类{lazy initialization}。代码如下

// Singleton reference for this class
    private static volatile FileProperties INSTANCE = null; 

    public static FileProperties getInstance() {
            if (INSTANCE == null) {
                synchronized (FileProperties.class) {
                    if (INSTANCE == null) {
                        INSTANCE = new FileProperties();
                    }
                }
            }
            return INSTANCE;
        }

我的问题是,通过 INSTANCE as volatile 可以获得什么好处 因为我们已经通过同步处理线程安全。 在这种情况下,volatile是否有任何好处?

1 个答案:

答案 0 :(得分:5)

这是因为没有volatile的双重检查锁定在Java中不是线程安全的。

制作线程安全的lazy-init单例的最简单方法是创建类持有者,如下所示:

public class SomeClass {
    private static class SomeClassHolder {
        public static final SomeClass INSTANCE = new SomeClass();
    }

    public static SomeClass getInstance() {
       return SomeClassHolder.INSTANCE;
    } 

    private SomeClass() {}

}

由于JVM行为的部分代码将加载SomeClassHolder并在getInstance()的第一次使用时创建SomeClass的实例(而不是在类加载器加载SomeClass时)。

您根本不需要使用任何同步!因为JVM正在为你做这件事。