Double CheckLock简称DCL模式,
优点是既能够保证用到的时候才初始化单例,又能够保证现成安全,且单例对象初始化后调用getInstance不进行同步锁。
代码如下
package demo;
public class Singleton {
private static Singleton mInstance = null;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (mInstance == null) {
synchronized (Singleton.class) {
if (mInstance == null) {
mInstance = new Singleton();
}
}
}
return mInstance;
}
}
getInstance方法中进行了2次判断null,第一次判断是避免不必要的同步,第二次是在null的情况下创先实例。
DCL优点:资源利用率高,第一次执行getInstance才会被实例化,效率高。
缺点:第一次加载时反映稍慢,也由于内存模型的原因偶尔会失败。在高并发的环境下也有一定的缺陷,虽然发生率很小。
DCL是使用最多的单例实现方式,它能够在需要时才实例化,并且能够在大多数时保证对象唯一性。
注:不低于JDK1.6版本以下