双重加锁的单例模式实现如下:
上面代码有一个问题:
在线程执行到第4行,代码读取到 instance 不为 null 时,instance引用的对象有可能还没有完全初始化。
问题的根源:
前面的 双重检查锁定上述代码的第7行(instance = new DoubleCheckedLocking())创建了一个对象。这一行代码可以分解为 下面的3行代码。
上面的3行伪代码中的2和3之间,可能被重排序,重排序如下:
多线程执行结果如下:
解决方案: 加上volatile关键字
本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/274505.html
赞 (186)
打赏 微信扫一扫
一文搞懂 C 语言 #、##、__VA_ARGS__
« 上一篇2020-01-04 22:18:32
如何通过Facebook中的“隐形”功能打开流量入口?
下一篇 »2020-01-04 22:33:29