单例模式五种方法
来源:互联网 发布:gta男性捏脸数据 编辑:程序博客网 时间:2024/05/21 14:55
1.懒汉式-线程安全,但效率低,不使用
public class Singleton { private static Singleton instance; private Singleton(){} public static synchronized Singleton getInstance(){ if(instance == null){ instance= new Singleton(); } return instance; }}
2.饿汉式
这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。
public class Singleton { private static Singleton instance= new Singleton(); private Singleton(){} public static Singleton getInstance(){ return instance; }}
3.静态内部类
这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它跟饿汉式不同的是(很细微的差别):饿汉式是只要Singleton类被装载了,那么instance就会被实例化(没有达到lazy loading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。想象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,我不希望在Singleton类加载时就实例化,因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比饿汉式就显得很合理。
public class Singleton { //3.静态内部类 private static class SingletonHolder{ private static final Singleton INSTANCE = new Singleton(); } private Singleton(){} public static final Singleton getInstance(){ return SingletonHolder.INSTANCE; }}
4.枚举
这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,个人认为由于1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,很少看见有人这么写过。
public enum Singleton {// 4.枚举 INSTANCE; public void whateverMethod(){ }}
5.双重校验锁
这个是第二种方式的升级版,俗称双重检查锁定,详细介绍请查看:http://www.ibm.com/developerworks/cn/java/j-dcl.html
在JDK1.5之后,双重检查锁定才能够正常达到单例效果。
public class Singleton{ //5.双重效验锁 private volatile static Singleton singleton; private Singleton(){} public static Singleton getSingleton(){ if(singleton == null){ synchronized (Singleton.class) { if(singleton == null){ singleton = new Singleton(); } } } return singleton; }}
- 单例模式五种方法
- 实现单例模式的五种方法
- 五种方法实现Java的Singleton单例模式
- 五、单例模式
- 单例模式的五种写法
- 单例模式的五种写法
- 单例模式的五种写法
- 单例模式五种实现方式
- 单例模式五种写法
- Java中创建单例模式的五种方法及线程安全
- 单例模式(五)
- 设计模式之五:单例模式
- 设计模式(五)单例模式
- 设计模式(五)单例模式
- java设计模式:五、单例模式
- JAVA设计模式(五)----单例模式
- 单例模式的五种实现方式
- 单例模式的五种实现形式
- 高二&高一&初三模拟赛20 总结
- House Robber:在不取相邻元素的情况下对数组求和
- BZOJ1455 罗马游戏
- 分享初学Electron遇到的坑和避免被坑
- 有关servlet,servletContext和response
- 单例模式五种方法
- String、stringbuffer、Stringbuilder的区别和讲解
- el&jstl
- springCloud(九)
- 输出菱形
- loadrunner Web_类函数之web_switch_net_layer()
- AI challenger 场景分类 PyTorch 迁移学习 resnet18
- Eclipse接入第三方动态库.so方案
- hbase表数据的写入流程:(根据rowkey进行写入)