读书人

Java中双重检测失败(DCL)的缘故

发布时间: 2012-10-08 19:54:56 作者: rapoo

Java中双重检测失败(DCL)的原因
用一个最简单最容易理解的解释方法(可能不是很正确),就是打如下比方:
Object a = new Object();
假设在Object对象创建过程中需要初始化两个值域m1和m2,正常的过程应该是:开始对象创建,得到一个对象句柄,m1初始化,m2初始化,把这个对象句柄赋值给变量a。
但是由于重排序的存在,可能实际的执行过程变为:开始对象创建,得到一个对象句柄,m1初始化,把这个对象句柄赋值给变量a,m2初始化。而另一个线程在这个对象句柄赋值给变量a后,m2初始化前来访问变量a,并通过a访问到这个创建中的对象,喏,问题出来了,m2初始化还没有完成呢...

类加载器延迟加载

public class Singleton {        private static class Holder {       static final Singleton instance = new Singleton();     }       public static Singleton getInstance() {       return Holder.instance;        }      }  


读书人网 >编程

热点推荐