单例设计模式
方法一:饿汉式
/** * 单例模式---->饿汉式 * @author wzc */ public class Singleton { private Singleton(){} //1.构造器私有化---->private----->防止外部创建对象 private static Singleton instance=new Singleton(); //2.在本来中创建一个对象实例--->private //3.提供一个外部能够获取这个唯一对象的接口----->public public static Singleton getInstance(){ //static--->外部不能创建对象,只能通过类的方式调用静态方法 return instance; //返回给外部这个唯一对象 } }
饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成。饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题
方法二:静态方法类
/** * 单例模式---->静态内部类 * @author wzc */ public class Singleton2 { private Singleton2(){}//1.构造器私有化 private static class SingletonHolder{//静态内部类 private static final Singleton2 instance=new Singleton2(); //实例化对象 } public static final Singleton2 getInstance(){ //只有调用getInstance才会实例化instance return SingletonHolder.instance; //返回唯一对象 } }
第一次加载Singleton类时并不会初始化sInstance,只有第一次调用getInstance方法时虚拟机加载SingletonHolder 并初始化sInstance ,这样不仅能确保线程安全也能保证Singleton类的唯一性,所以推荐使用静态内部类单例模式。
方法三:懒汉式
/** * 单例模式-----懒汉式 * 线程安全 * @author WZC */ public class Singleton3 { private Singleton3(){} //私有化构造器 private static Singleton3 instance; //声明单例对象 //外部公有获取单例对象的接口 public static synchronized Singleton3 getInstance(){ if (instance==null) { //判断单例对象是否已经被初始化 instance=new Singleton3(); //未被初始化则进行初始化,否则不再重复初始化 } return instance; //返回单例对象 } }
延迟加载,即当需要用到此单一实例的时候,才去初始化此单一实例。
方法四:双重检查锁定
/** * 单例模式----双重锁 * 线程安全+高效 * @author wzc */ public class Singleton4 { private Singleton4(){} //私有化构造器 private static Singleton4 instance; //声明单例对象 //给外界提供公有获取单例对象的接口 public static Singleton4 getInstance(){ if (instance==null) { // 判断是否已经被实例化 synchronized (Singleton4.class) { //为线程提供锁 if (instance==null) { //由线程等待-->运行态时,线程可能已经被实例化了,所以在判断一次是否被实例化 instance=new Singleton4(); //初始化单例对象 } } } return instance; //返回单例对象 } }
上一份效率有点低,这种方法提高了效率
方法五:枚举类型
/** * 单例模式----枚举类型 * @author wzc * */ public enum Singleton5 { INSTANCE; public void doSomeThing() { } }