- 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已经分配了引用实例,但是这个实例的初始化指令还没执行。