单例模式的5种实现方式
Posted Harvey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式的5种实现方式相关的知识,希望对你有一定的参考价值。
1.饿汉模式(线程安全,调用效率高,但是不能延时加载):
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.懒汉模式(线程安全,调用效率不高,但是能延时加载):
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.枚举类(线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用):
package com.yanwu.www.demo; /* * 单例模式 * * 枚举式实现 * * 1.避免了反射和反序列化的漏洞 * * 2.没有延时加载的效果 * * @author harvey */ public enum SingletonDemo4 { //枚举元素本身就是单例 INSTANCE; //添加自己需要的操作 public void singletonOperation(){ } }
如何选用:
-单例对象 占用资源少,不需要延时加载,枚举 好于 饿汉
-单例对象 占用资源多,需要延时加载,静态内部类 好于 懒汉式
以上是关于单例模式的5种实现方式的主要内容,如果未能解决你的问题,请参考以下文章