3

我遇到了一个单例类{延迟初始化}。代码如下

// 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;
        }

我的问题是通过将实例设置为易失性我们得到了什么好处, 因为我们已经通过同步处理了线程安全。在这种情况下 volatile 有什么好处吗?

4

1 回答 1

5

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

制作线程安全的惰性初始化单例的最简单方法是创建类持有者,如下所示:

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 并在首次使用时创建 SomeClass 的实例getInstance()(而不是在类加载器加载 SomeClass 时)。

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

于 2013-05-14T11:53:54.913 回答