我们可以通过哪些不同的方式来打破 Java 中的单例模式。我知道一种方法,即如果我们不同步 singleton 中的方法,那么我们可以创建多个类的实例。因此应用了同步。有没有办法打破单例 java 类。
public class Singleton {
private static Singleton singleInstance;
private Singleton() {
}
public static Singleton getSingleInstance() {
if (singleInstance == null) {
synchronized (Singleton.class) {
if (singleInstance == null) {
singleInstance = new Singleton();
}
}
}
return singleInstance;
}
}
原文由 Harsha_2012 发布,翻译遵循 CC BY-SA 4.0 许可协议
从您给定的代码开始,“双重检查锁定”可能会在某些环境中被破坏,当在使用 Symantec JIT 的系统上运行时,它不起作用。特别是,Symantec JIT 编译
如下(注意 Symantec JIT 使用基于句柄的对象分配系统)。
如您所见,对 singletons[i].reference 的赋值是在调用 Singleton 的构造函数之前执行的。这在现有的 Java 内存模型下是完全合法的,在 C 和 C++ 中也是合法的(因为它们都没有内存模型)。
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
除此之外
Serializable
它可能会中断Reflection
(我相信)* 你如何解决违反规则的问题?
readResolve()
方法并抛出异常clone()
并抛出CloneNotSupported
异常例子
毕竟我建议使用 Enum 作为 Singleton 最安全的方法(因为 java5 最好的方法是使用枚举)