设计模式——单例模式

单例模式的定义

单例模式保证一个类在全局中只有一个实例对象。

单例模式的几种实现方式

饿汉模式

在类加载的时候就已经实例化对象,没有延迟加载,但由于类加载的机制能保证线程安全,典型的空间换时间;

饿汉模式

懒汉模式

只有在调用getInstance()的时候才会实例化对象,但需要加上synchronized关键字保证线程安全,具有延迟加载的功能,
典型的时间换空间,与饿汉相比会比较消耗性能。

懒汉模式

DCL双重检查模式

懒汉模式的改进版,主要有两个地方的改进:同步锁改进和线程安全改进
同步改进:采用了双重检查的模式,第一层检查避免了不必要的加锁同步;第二层检查保证实例为null时才会初始化实例对象;
线程安全改进:实例变量采用了volatile关键字声明,volatile的语义能禁止指令重排序;在JVM中有一种优化机制叫乱序执行,也就是说为了执行效率,CPU可能不会按照代码的顺序执行,但是最终的执行结果跟代码顺序执行的结果是一致的。在这里volatile主要是解决DCL模式失效的问题,因为在new Singleton()初始化对象时不是一个原子操作,主要有三步:
(1)为实例变量分配内存;
(2)调用构造函数;
(3)实例变量执行已经分配的内存地址;
如果CPU乱序执行的话,有可能会按(1)(3)(2)的顺序执行,如果此时有线程A和线程B,线程A执行完了(3)还未执行(2)之前,切换到了线程B,那么此时线程B获得的实例就是非null的,线程B就直接返回该未初始化完成的实例对象,导致DCL失效。

DCL双重检查模式

静态内部类

其实就是饿汉模式的改进版本,增加了延迟加载的功能。不会在类加载的时候就实例化对象,只有在调用getInstance()的时候才会实例化,同时由于内部类加载的方式可以保证线程安全,写起来也比较简单。

静态内部类

补充

1、单例的构造函数必须声明为private,保证不会被外界通过new的方式进行实例化;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 设计模式-单例模式 单例模式在网上已经是被写烂的一种设计模式了,笔者也看了不少的有关单例模式的文章,但是在实际生产...
    醒着的码者阅读 807评论 1 2
  • 定义 确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 应用场景 确保某个类有且只有一个对象的场景...
    Utte阅读 568评论 0 0
  • 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 单例模式的使用很广泛,比如:线程池(threa...
    richy_阅读 369评论 0 0
  • 写在前面# 其实我也不知道想说什么,来简书已经足足15天了,每天都在通过文字总结和分享自己的所学知识,写技术文章好...
    孑然自安阅读 2,099评论 1 9
  • 对不起,我那些被虚度的光阴 我知道自己正在死去 每一日,都是诀别,对未来的辜负 可是我不知道如何挽留 什么样的方式...
    漠之舟阅读 331评论 0 0

友情链接更多精彩内容