单例模式回顾一下?

public class Singleton {
    //volatile关键字,禁止指令重排序
    //因为 instance = new Singleton();的指令有三个:
    //1、给instance分配内存
    //2、调用构造函数初始化成员变量
    //3、将instance对象指向分配的内存空间(执行完这步后instance才不为null    //当第三个指令先于第二个指令执行完成,就会有线程拿到未初始化的instance,就会出错了
    private volatile static Singleton instance;
    private Singleton(){}

    //为解决线程不安全问题,这里加入了synchronized,但是synchronized比较耗性能,不能多用,而且只需要在实例化的时候用一次就行了,实例化后就不需要了
    //所以就用了双重检查锁模式,非常适用于高并发
    public static Singleton getInstance(){
        if(instance == null){
            synchronized (Singleton.class){
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }



    //饿汉式
    //在类加载的时候实例化
//    private static final Singleton instance = new Singleton();
//    public static Singleton getInstance(){
//        return instance;
//    }

    //静态内部类
    //类似于饿汉式,将实例化延迟到内部类的加载
//    private static class Holder{
//        private static final Singleton INSTANCE = new Singleton();
//    }
//    public static Singleton getInstance(){
//        return Holder.INSTANCE;
//    }
}

猜你喜欢

转载自blog.csdn.net/u010015933/article/details/80931215