您的位置 首页 java

Java开发者:单例模式实现的7种套路,你知道几个?

Java开发者:单例模式实现的7种套路,你知道几个?

Java 中单例(Singleton)模式是一种广泛使用的设计模式。为了协调系统整体的行为,一些管理器和控制器常被设计成 单例模式

作用 :保证 类在内存中 实例 对象的唯一性,节省了系统资源,提高系统性能

一般适用场景

  • 1.避免同个类创建多个实例造成资源的浪费。

  • 2.避免多个实例因多次调用而出现错误。

  • 3.一般写工具类, 线程池 ,缓存,数据库会用到。

Java开发者:单例模式实现的7种套路,你知道几个?

基本的实现思路

  • 1.不准在类的外部new对象 —— 构造方法 私有化

  • 2.在类的内部中提供创建对象的方法—— 通过new在本类中创建一个实例

  • 3.对外部提供一个获取该实例的方法 —— 定义公有方法返回创建的实例

饿汉模式与懒汉模式比较

前者在 类装载时 就同时 实例化 ,后者只有在 第一次被使用 时才会实例化。

1. 饿汉模式的优点是没有 线程 同步问题,缺点是用不到还会加载,资源浪费。

2. 懒汉模式的优点是实现了 懒加载 ,节省资源,但是需要解决线程安全问题。

Java开发者:单例模式实现的7种套路,你知道几个?

常见的七种单例模式实现套路

<1> 饿汉式 ,没有实现懒加载,代码如下

Java开发者:单例模式实现的7种套路,你知道几个?

<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种套路,你知道几个?

文章地址:https://www.zhihuclub.com/182420.shtml

关于作者: 智云科技

热门文章

网站地图