java – 双重锁定模式:是否断开?

前端之家收集整理的这篇文章主要介绍了java – 双重锁定模式:是否断开?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么这种模式被打破了?对我来说好吗?有任何想法吗?
public static Singleton getInst() {
    if (instace == null) createInst();
    return instace;
}

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

解决方法

看起来好像很好,但是这种技术有许多微妙的问题,通常应该避免.例如,考虑以下事件序列:

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

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

猜你在找的Java相关文章