首页 > 科技 > 单例模式双重检查加锁为什么需要加上volatile关键字?

单例模式双重检查加锁为什么需要加上volatile关键字?


双重加锁的单例模式实现如下:

上面代码有一个问题:

在线程执行到第4行,代码读取到 instance 不为 null 时,instance引用的对象有可能还没有完全初始化。

问题的根源:

前面的 双重检查锁定上述代码的第7行(instance = new DoubleCheckedLocking())创建了一个对象。这一行代码可以分解为 下面的3行代码。

上面的3行伪代码中的2和3之间,可能被重排序,重排序如下:

多线程执行结果如下:

解决方案: 加上volatile关键字

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/274505.html