Java中Singleton类中的易失性字段

时间:2012-11-07 18:23:26

标签: java singleton volatile

在某些网站/博客中,我发现Singleton代码为

public class MySingleton{

    private static MySingleton instance = null;
    .......
    .......
}

在其他一些方面,我发现Singleton代码为

public class MySingleton{

    private volatile static MySingleton instance = null;
    .......
    .......
}

是否有必要将MySingleton引用为volatile?它会有什么意义吗?

5 个答案:

答案 0 :(得分:1)

Java中的Volatile用作Java编译器和Thread的指示符,它不缓存此变量的值并始终从主内存中读取

**编辑**

private volatile static MySingleton instance = null;

在上面的代码片段中,volatile关键字确保多个线程在初始化为MySingleton实例时正确处理instance变量。

了解详情:http://javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html#ixzz2BYyA5Jnm

答案 1 :(得分:0)

嗯,是的,如果它是可变的并且出现在多线程代码中。你只需要了解volatile的含义,单身人士是否需要使用它就没有什么特别之处。

答案 2 :(得分:0)

无法分辨 - 两个示例中的字段都是私有的,因此根据它们的实现方式,您可能需要也可能不需要它们是易变的。标准惯用语是to use an enum

答案 3 :(得分:0)

您想要使用enum

保持简单
public enum MySingleton {
    INSTANCE
}

或者你有充分的理由让它更复杂

public class MySingleton {
    private MySingleton() { }

    private static MySingleton instance = null;

    public synchronized static MySingleton getInstance() {
         if (instance == null)
             instance = new MySingleton();
         return instance;
    }
}

无论哪种方式,使用volatile都无济于事。

恕我直言,没有一个好的 Singleton 模式,你可以使用volatile,所以如果需要,代码需要修复或简化。


AFAIK唯一可以使用volatile的情况是双重检查锁定

public class MySingleton {
    private MySingleton() { }

    private static volatile MySingleton instance = null;

    public static MySingleton getInstance() {
         if (instance == null)
             synchronzied(MySingleton.class) {
                 if (instance == null)
                     instance = new MySingleton();
             }
         return instance;
    }
}

为了进行比较,上面的enum示例做了很多样本​​事情。

http://javarevisited.blogspot.co.uk/2011/06/volatile-keyword-java-example-tutorial.html

http://www.ibm.com/developerworks/java/library/j-dcl/index.html

答案 4 :(得分:0)

只有在多线程系统中有可变单例字段时才需要这样做,特别是在单例素被懒惰地初始化的情况下。

这是关于如何在Java中多线程系统中懒惰地初始化单例的更大讨论的一部分。有几种机制可用于此,但最受欢迎的是:

当前接受的为多线程系统保留延迟初始化单例的方法是enum方法,尽管它们中的所有4个都在Java 1.5 +中工作。