设计模式——单例模式详解

单例模式

解释:单例模式属于创建型模式,提供了一种创建对象的最佳方式。该类负责创建自己的对象,同样确保只有单个对象被创建。

应用场景
(1) 资源共享的情况下,避免频繁创建和销毁消耗系统资源,比如说日志模块和读取系统配置。
(2) 控制资源的情况,方便资源之间的相互通信,比如线程池等。

实现方式:

1. 懒汉式(线程不安全)

是否Lazy 初始化:是
是否线程安全:否

实例代码:


public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
  
    public static Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}

2. 懒汉式(线程安全)

是否Lazy初始化:是
是否线程安全:是
缺点:加锁会影响效率

实例代码:


public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}

3. 饿汉式

是否 Lazy 初始化:否
是否多线程安全:是
缺点:类加载后就初始化,浪费内存。

实例代码:


public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    	return instance;  
    }  
}

4. 双检锁/双重校验锁(DCL,即 double-checked locking)

是否 Lazy 初始化:是
是否多线程安全:是
优点:该方式采用双锁机制,线程安全并且保证高性能。

示例代码:


public class Singleton {  
//volatile 禁止代码重排序,避免多线程调用时返回空对象。
    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;  
    }  
}

5. 登记式/静态内部类

是否 Lazy 初始化:是
是否多线程安全:是
解释:使用静态内部类,外部类被加载后,instance 不一定被初始化。只有显式调用getInstance方法时,才会显式装载SingletonHolder类,从而实例化instance。

实例代码:


public class Singleton {  
    private static class SingletonHolder {  
    private static final Singleton INSTANCE =
    							 new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
    return SingletonHolder.INSTANCE;  
    }  
}

6. 枚举

是否 Lazy 初始化:否
是否多线程安全:是
解释:自动支持序列化机制,防止多次实例化。序列化会生成新的对象,破坏单例模式。要想防止多次实例化,Singleton类要实现Serializable接口,并且重写readResolve方法,返回唯一对象singleton。而枚举类底层已经将这些封装好了,所以枚举类能够防止多次实例化。


public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
}

实现方式总结:
在这里插入图片描述
补充:
破坏单例模式的两种办法

  1. 反射
  2. 序列化

解决办法

  1. 反射:无参构造方法增加判断singleton是否为空
  2. 序列化:Singleton类要实现Serializable接口,并且重写readResolve方法,返回唯一对象singleton

解决问题永远是我最大的快乐,当然,我得首先面对自己,不蒙住自己的眼睛,勇敢的去看到问题,不逃避。

参考文章:
[1] 序列化对单例的破坏
[2] 单例模式
[3] 《Spring 5核心原理与30个类手写实战》 谭勇德

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript的设计模式详解是一本由涂根华所写的书籍,它非常详细地介绍了JavaScript的设计模式。这本书以单例模式为开篇,单例模式保证一个类只有一个实例,并提供一个全局访问点。这是一种常用的模式,可应用于许多场景中。 此外,这本书还介绍了解释器模式。解释器模式是指给定一个语言,定义该语言的文法表示,并定义一个解释器来解释语言中的句子。在开篇之前,还科普了一些相关概念,如抽象语法树。 这本书是为那些正在学习前端的人准备的,它提供了深入的知识和实践经验,希望能帮助更多的前端开发者。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Javascript设计模式详解](https://blog.csdn.net/lhjuejiang/article/details/80635527)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [JavaScript设计模式单例模式详解](https://download.csdn.net/download/weixin_38623366/13629637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [javascript设计模式之解释器模式详解](https://download.csdn.net/download/weixin_38734008/14813983)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值