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
今日推荐
周排行