在某些网站/博客中,我发现Singleton代码为
public class MySingleton{
private static MySingleton instance = null;
.......
.......
}
在其他一些方面,我发现Singleton代码为
public class MySingleton{
private volatile static MySingleton instance = null;
.......
.......
}
是否有必要将MySingleton
引用为volatile
?它会有什么意义吗?
答案 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中多线程系统中懒惰地初始化单例的更大讨论的一部分。有几种机制可用于此,但最受欢迎的是:
volatile
enum
instead of a class
当前接受的为多线程系统保留延迟初始化单例的方法是enum
方法,尽管它们中的所有4个都在Java 1.5 +中工作。