1.饿汉模式(线程安全,调用效率高,可是不能延时加载):html
package com.yanwu.www.demo; /* * 测试单例模式 * * 饿汉模式 * * @author harvey * */ public class SingletonDemo1 { //类初始化时当即加载对象(没有延迟加载的优点),自然的线程安全 private static SingletonDemo1 instance=new SingletonDemo1(); //构造器私有化 private SingletonDemo1(){} //方法没有同步,调用效率高 public static SingletonDemo1 getInstance(){ return instance; } }
2.懒汉模式(线程安全,调用效率不高,可是能延时加载):java
package com.yanwu.www.demo; /* *测试单例模式 * *懒汉模式 * *@author harvey * */ public class SingletonDemo2 { //类初始化时,不初始化这个对象(延时加载,真正用的时候再建立) private static SingletonDemo2 instance; //构造器私有化 private SingletonDemo2(){} //方法同步,调用效率低 public static synchronized SingletonDemo2 getInstance(){ if(instance==null){ instance=new SingletonDemo2(); } return instance; } }
3.双重检测锁模式(因为JVM底层模型缘由,偶尔会出问题,不建议使用):安全
package com.yanwu.www.demo; /* * 单例模式 * * 双重检测锁式 * * 因为JVM底层内部模型原型,偶尔会出现问题,不建议使用 * * @author harvey */ public class SingletonDemo5 { private volatile static SingletonDemo5 SingletonDemo5; private SingletonDemo5() { } public static SingletonDemo5 newInstance() { if (SingletonDemo5 == null) { synchronized (SingletonDemo5.class) { if (SingletonDemo5 == null) { SingletonDemo5 = new SingletonDemo5(); } } } return SingletonDemo5; } }
4.静态内部类式(线程安全,调用效率高,能够延时加载):并发
package com.yanwu.www.demo; /* * 单例模式 * * 静态内部类的实现 * * 1.外部类没有static 属性,不会像饿汉同样当即加载对象 * * 2.只有真正调用getInstance()才会加载静态内部类,加载时是线程安全的 * * 3.兼并延时调用和并发高效调用 * * @author harvey * */ public class SingletonDemo3 { private static class SingletonClassInstance{ private static final SingletonDemo3 instance=new SingletonDemo3(); } private SingletonDemo3(){} public static SingletonDemo3 getInstance(){ return SingletonClassInstance.instance; } }
5.枚举类(线程安全,调用效率高,不能延时加载,能够自然的防止反射和反序列化调用):ide
package com.yanwu.www.demo; /* * 单例模式 * * 枚举式实现 * * 1.避免了反射和反序列化的漏洞 * * 2.没有延时加载的效果 * * @author harvey */ public enum SingletonDemo4 { //枚举元素自己就是单例 INSTANCE; //添加本身须要的操做 public void singletonOperation(){ } }
如何选用:测试
-单例对象 占用资源少,不须要延时加载,枚举 好于 饿汉ui
-单例对象 占用资源多,须要延时加载,静态内部类 好于 懒汉式spa