单例设计模式

178 阅读1分钟

懒汉式之双重检查

/**
 * 单例模式-懒汉式之双重检查
 * @author huanghuicheng
 */
public class LazyDoubleCheckSingleton {
    private static volatile LazyDoubleCheckSingleton lazyDoubleCheckSingleton;

    private LazyDoubleCheckSingleton() {}

    public static LazyDoubleCheckSingleton getInstance() {
        if (lazyDoubleCheckSingleton == null) {
            synchronized (LazyDoubleCheckSingleton.class) {
                if (lazyDoubleCheckSingleton == null) {
                    /*
                     * new 一个实例对象需要经过3个步骤:
                     * 1. 在堆上分配内存
                     * 2. 初始化对象
                     * 3. 使变量指向分配好内存空间
                     *
                     * 2、3两个步骤可能发生指令重排序,在单线程中指令重排序不影响程序执行的结果。
                     * 但在多线程中,会发生异常。添加volatile关键可以规避指令重排序带来的问题
                     */
                    lazyDoubleCheckSingleton = new LazyDoubleCheckSingleton();
                }
            }
        }
        return lazyDoubleCheckSingleton;
    }
}

懒汉式之静态内部类

/**
 * 通过静态内部类延迟创建单例对象
 * @author huanghuicheng
 */
public class StaticInnerClassSingleton {
    private StaticInnerClassSingleton() {}

    private static class InnerClass{
        private static StaticInnerClassSingleton staticInnerClassSingleton = new StaticInnerClassSingleton();
    }

    public static StaticInnerClassSingleton getInstance() {
        return InnerClass.staticInnerClassSingleton;
    }
}

注意:静态内部类加初始化锁,通过多线程调试可以查看现象