设计模式之单例模式(Singleton Pattern)

作者 : 开心源码 本文共951个字,预计阅读时间需要3分钟 发布时间: 2022-05-13 共145人阅读

单例模式的概述

单例模式,就是在应用中确保某个对象只能存在一份。

主要办法就是把类的构造函数私有化,提供一个私有静态的变量,并提供一个静态方法获取单例对象。

5种创立单例模式的方法

1.懒汉模式(非线程安全)

这种模式创立在多线程情况下,存在初始化多个对象的情况,例如:A线程执行了lazyPattern == null之后sleep了,线程B进入后发现lazyPattern == null,于是B初始化一个对象,A线程获取运行权限之后,继续初始化了一个对象。相当于初始化了两次。

懒汉模式(非线程安全)

2.懒汉模式(线程安全)

synchronized的目的是在同一时间里,只允许有一个线程进入getSimpleInstance方法,处理了线程问题,带来了效率问题。

懒汉模式(线程安全)

3.双重检查创立单例,处理了上述在方法上加入synchronized带来的效率问题,仅在有需要的时候,在创立单例的代码块里加synchronized效率略微好一点。在synchronized里面加第二个检查是由于防止多个线程在第一次获取单例对象时,同时执行完single==null,带来的线程安全问题,volatile是防止single变量,在分配内存,初始化,赋值的cpu执行顺序不一致导致的线程安全问题,其实jvm在运行代码时候会重新排序指令,cpu也会优化指令。

双重检查实现单例

4.饿汉模式,处理了线程安全问题,带来的内存问题。不用的时候单例对象也占内存。饿汉模式中,静态变量定义时一般不建议调用少量方法。由于这种调用当出错时,调试和解决都比较异类。

饿汉模式

5.静态内部类实现单例模式

这种方式在调用getUniqueInstance()的时候,才开始分配内存创立单例对象,挺好的办法。推荐。

静态内部类

6.Enum实现单例

Enum主要是通过虚拟机来管理对象的创立。该实现防止了反射来的安全问题。用类实现单例,可以通过反射拿到私有成员变量,创立对象。

枚举方式

代码地址:Singleton GitHub Code

参考文档:https://cyc2018.github.io/CS-Notes/#/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%20%20-%20%E5%8D%95%E4%BE%8B

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 设计模式之单例模式(Singleton Pattern)

发表回复