public class DCLExample {
private static DCLExample instance;
public static DCLExample getInstance(){
if (instance==null){
synchronized (DCLExample.class){
if (instance==null){
instance = new DCLExample();
}
}
}
return instance;
}
}
- 为对象分配内存空间
- 初始化对象
- 把实例对象赋值给 instance 引用
由于这是三个指令并不是原子的(如图)。 按照重排序规则,在不影响单线程执行结果的情况下,两个不存在依赖关系的指令允许重排序,也就是不一定会按照代码编写顺序来执行。
这样一来,(如图)就会导致其他线程可能拿到一个不完整的对象,也就是这个 instance已经分配了引用实例,但是这个实例的初始化指令还没执行。文章来源:https://www.toymoban.com/news/detail-717171.html
文章来源地址https://www.toymoban.com/news/detail-717171.html
到了这里,关于DCL 单例模式设计为什么需要 volatile 修饰实例对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!