加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 17:44:56 所属栏目:Java 来源:网络整理
导读:为什么这种模式被打破了?对我来说好吗?有任何想法吗? public static Singleton getInst() { if (instace == null) createInst(); return instace;}private static synchronized createInst() { if (instace == null) { instace = new Singleton(); }} 解
为什么这种模式被打破了?对我来说好吗?有任何想法吗?
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”关键字正确处理您的单例实例来避免这种情况

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读