为什么图案被认为是破损的?在我看来还好吗?有任何想法吗?

public static Singleton getInst() {
    if (instace == null) createInst();
    return instace;
}

private static synchronized createInst() {
     if (instace == null) {
         instace = new Singleton();
     }
}

最佳答案

乍一看似乎还可以,但是这种技术存在许多细微的问题,通常应避免使用。例如,考虑以下事件序列:

  • 线程A注意到该值为
    未初始化,因此它获得了
    锁定并开始初始化
    值(value)。
  • 允许编译器生成的代码
    将共享变量更新为
    指向部分构造
    A完成之前的对象
    执行初始化。
  • 线程B注意到共享
    变量已经初始化(等等
    出现),并返回其值。
    因为线程B相信值(value)
    已经被初始化,它没有
    获取锁。如果B使用
    在所有对象之前
    由A完成的初始化由
    B该程序可能会崩溃。

  • 您可以通过使用“volatile”关键字来正确处理您的单例实例来避免这种情况

    关于java - 仔细检查了锁定模式: Broken or not?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3616769/

    10-10 01:09