为什么图案被认为是破损的?在我看来还好吗?有任何想法吗?
public static Singleton getInst() {
if (instace == null) createInst();
return instace;
}
private static synchronized createInst() {
if (instace == null) {
instace = new Singleton();
}
}
最佳答案
乍一看似乎还可以,但是这种技术存在许多细微的问题,通常应避免使用。例如,考虑以下事件序列:
未初始化,因此它获得了
锁定并开始初始化
值(value)。
将共享变量更新为
指向部分构造
A完成之前的对象
执行初始化。
变量已经初始化(等等
出现),并返回其值。
因为线程B相信值(value)
已经被初始化,它没有
获取锁。如果B使用
在所有对象之前
由A完成的初始化由
B该程序可能会崩溃。
您可以通过使用“volatile”关键字来正确处理您的单例实例来避免这种情况
关于java - 仔细检查了锁定模式: Broken or not?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3616769/