单例模式的写法

2018-08-01  本文已影响0人  皮皮咕

普通懒汉模式--非线程安全

public class SingletonExample1 {
    // 私有构造函数
    private SingletonExample1() {}
    // 单例对象
    private static SingletonExample1 instance = null;
    // 静态的工厂方法
    public static SingletonExample1 getInstance() {
        if (instance == null) {
            instance = new SingletonExample1();
        }
        return instance;
    }
}

普通饿汉模式--线程安全,但是若初始化过程比较复杂,则可能会浪费资源

public class SingletonExample2 {
    // 私有构造函数
    private SingletonExample2() {}
    // 单例对象
    private static SingletonExample2 instance = new SingletonExample2();
    // 静态的工厂方法
    public static SingletonExample2 getInstance() {
        return instance;
    }
}

加synchronized的懒汉模式--线程安全,但是加锁使得访问的速度变慢

public class SingletonExample3 {
    // 私有构造函数
    private SingletonExample3() {}
    // 单例对象
    private static SingletonExample3 instance = null;
    // 静态的工厂方法
    public static synchronized SingletonExample3 getInstance() {
        if (instance == null) {
            instance = new SingletonExample3();
        }
        return instance;
    }
}

双重同步锁懒汉模式--非线程安全

public class SingletonExample4 {
    // 私有构造函数
    private SingletonExample4() {}
    // 单例对象
    private static SingletonExample4 instance = null;
    // 静态的工厂方法
    public static SingletonExample4 getInstance() {
        if (instance == null) { 
            synchronized (SingletonExample4.class) { 
                if (instance == null) {
                    // memory = allocate(); //1.分配对象内存空间
                    // instance(memory);    //2.初始化对象
                    // instance = memory;   //3.设置instance指向刚分配的内存地址,此时instance!=null
                    // 指令重排机制会使该方法出现线程问题
                    instance = new SingletonExample4();
                }
            }
        }
        return instance;
    }
}

加volatile双重同步锁懒汉模式--线程安全

public class SingletonExample4 {
    // 私有构造函数
    private SingletonExample4() {}
    // 单例对象,volatile禁止指令重排
    private volatile static SingletonExample4 instance = null;
    // 静态的工厂方法
    public static SingletonExample4 getInstance() {
        if (instance == null) { 
            synchronized (SingletonExample4.class) { 
                if (instance == null) {
                    instance = new SingletonExample4();
                }
            }
        }
        return instance;
    }
}

枚举--推荐使用

public class SingletonExample7 {
    // 私有构造函数
    private SingletonExample7() {}
    // 获取实例
    public static SingletonExample7 getInstance() {
        return Singleton.INSTANCE.getInstance();
    }
    // 枚举
    private enum Singleton {
        INSTANCE;
        private SingletonExample7 singleton;
        // JVM保证这个方法绝对只调用一次
        Singleton() {
            singleton = new SingletonExample7();
        }
        public SingletonExample7 getInstance() {
            return singleton;
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读