单例模式实现的7种套路,你知道几个?
ava中单例(Singleton)模式是一种广泛使用的设计模式。为了协调系统整体的行为,一些管理器和控制器常被设计成单例模式。
作用:保证类在内存中的实例对象的唯一性,节省了系统资源,提高系统性能。
一般适用场景:
1.避免同个类创建多个实例造成资源的浪费。
2.避免多个实例因多次调用而出现错误。
3.一般写工具类,线程池,缓存,数据库会用到。
基本的实现思路:
1.不准在类的外部new对象 --构造方法私有化
2.在类的内部中提供创建对象的方法--通过new在本类中创建一个实例
3.对外部提供一个获取该实例的方法 --定义公有方法返回创建的实例
饿汉模式与懒汉模式比较
前者在类装载时就同时实例化,后者只有在第一次被使用时才会实例化。
1. 饿汉模式的优点是没有线程同步问题,缺点是用不到还会加载,资源浪费。
2. 懒汉模式的优点是实现了懒加载,节省资源,但是需要解决线程安全问题。
常见的七种单例模式实现套路
<1>饿汉式,没有实现懒加载,代码如下
<2>懒汉式
虽然实现了懒加载,线程安全问题还存在,举例说有两个线程都刚好执行完条件if(instance == null),然后准备执行instance = new Singleton() 语句,这样的结果会导致内存中实例化了两个Singleton对象,为了解决线程不安全问题,可以对getInstance()方法进行加锁控制。
<3>懒汉式加锁版
为getInstance方法加锁虽然保证了线程安全,但是每次执行getInstance() 都需要同步,而实例化对象只需要执行一次就够了,以后获取时直接return返回就好了,方法同步效率太低,一种改进后的写法是:synchronized (Singleton.class) { instance = new Singleton(); }但是,这样写依然是线程不安全的,如果你还是想用懒汉式的话,推荐双重检查锁定(DCL,Double Check Lock)。
<4>懒汉式双重校验锁(DCL模式)
在代码中进行了两次if检查,这样就可以保证线程安全,初始化一次后,后面再次访问时,if检查,直接return 实例化对象。volatile关键字是在JDK1.5后引入的,volatile关键字会屏蔽Java虚拟机所做的一些代码优化,会导致系统运行效率降低,而更好的写法是使用静态内部类来实现单例!
<5>静态内部类实现单例(推荐)
和饿汉式类似,都是通过JVM类加载机制来保证初始化实例的时候只存在一个线程,避免线程安全问题,饿汉式的Singleton类被加载时,就会实例化,而静态内部类这种,当Singleton类被加载时,不会立即实例化,调用getInstance() 方法才会装载SingletonHolder类,从而完成Singleton的实例化。
<6>枚举实现单例
INSTANCE即为SingletonEnum类型的引用,得到它就可以调用枚举中的方法。既避免了线程安全问题,还能防止反序列化重新创建新的对象,但同时也损失了类的一些特性,也没有延时加载了。
<7>容器实现单例
将多种单例类型注入到一个全局的管理类中,在使用时根据key获取相应实例对象,有些类似工厂模式。可以管理多种类型的单例,在使用时可以通过统一的接口进行获取,降低了使用成本,也对外部隐藏了具体实现,耦合度得到了降低。
阅读更多- Java学习笔记———《单例模式的7种实现详解》
- 知道这两个商业模式的人,都实现了财务自由
- java 单例模式 几个实现方法
- android 知乎和简书的夜间模式实现套路
- 程序员必须知道和动手实现的7种排序算法 .
- java 单例模式 几个实现方法
- C++实现设计模式(前传) 之 你必须知道的构造函数
- Android 利用an框架快速实现夜间模式的两种套路
- 第37天(就业班) 静态代理与动态代理、oglib代理、手动实现aop编程、注解实现AOP编程、aop相关的几个注解、xml实现aop、切入点表达式、spring对aop模式
- 单例模式详细分析&7种实现方式
- 【脚本语言系列】关于Python实现网络模式发布-订阅,你需要知道的事
- 单例模式7种实现
- Java--单例模式7种实现
- 知乎和简书的夜间模式实现套路
- 夜间模式的实现套路
- 最近做了一个小东西,对于接口实现类。发现很多都是一个套路,所以备份下,以后可以经常用到! 这几个是单纯查询的实现类。
- 你知道的,javascript语言的执行环境是"单线程模式",这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行,因此很多时候需要进行“异步模式”,请列举js异步编程的方法。
- Linux 休眠,挂起(待机),关机等几个命令的区别及如何实现;如何启用Ubuntu的休眠模式
- python中7种实现单例模式的方法:staticmethod、classmethod、类属性方法、__new__、装饰器、元类、名字覆盖
- java 单例模式的7种实现方法