单例模式设计(二)

简介: 根据上面的 "懒汉模式" 和 "饿汉模式"。我们可以知道,懒汉模式,它只是负责读取,没有修改。而 " 饿汉模式 " 是既读取,也进行修改。所以来说, "懒汉模式" 是线程安全的, "饿汉模式" 是线程不安全的。

懒汉模式优化

根据上面的 "懒汉模式" 和 "饿汉模式"。我们可以知道,懒汉模式,它只是负责读取,没有修改。而 " 饿汉模式 " 是既读取,也进行修改。所以来说, "懒汉模式" 是线程安全的, "饿汉模式" 是线程不安全的。


所以为了使 " 饿汉模式" 线程安全,我们做以下几步操作:


1. 进行加锁:怎么加呢???


我们应该给整个 if 语句进行加锁,防止两个线程同时调用的时候都为 null ,从而就实例化了两个。


//懒汉模式优化
public class Demo3 {
    private static volatile Demo3 instance = null;
    //获取这个实例
    public static Demo3 getInstance() {
            synchronized (Demo3.class) {
                if (instance == null) {
                    instance = new Demo3();
                }
            }
        return instance;
    }
    //把构造方法设置为私有 外部不能 new 这个类对象
    private Demo3(){}
}


2. 线程安全是解决了,但是呢?


我们会发现,后续我们每次调用 getInstance() 的时候,都必须进行加锁一次,我们也没必要每次都加锁(加锁其实也是很大的开销,可能会使好多线程阻塞等待,影响了效率),当不为 null 的时候,就不用加锁了,这样就迎刃而解了~~~

//懒汉模式优化
public class Demo3 {
    private static volatile Demo3 instance = null;
    //获取这个实例
    public static Demo3 getInstance() {
        if (instance == null) {
            synchronized (Demo3.class) {
                if (instance == null) {
                    instance = new Demo3();
                }
            }
        }
        return instance;
    }
    //把构造方法设置为私有 外部不能 new 这个类对象
    private Demo3(){}
}


目录
打赏
0
0
0
0
1
分享
相关文章
创建型设计模式06-单例模式
创建型设计模式06-单例模式
48 0
特殊类设计及单例模式(C++)
特殊类设计及单例模式(C++)
97 1
|
10月前
|
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
54 5
软件设计模式:单例模式
软件设计模式:单例模式
01.单例模式设计思想
本文详细介绍了单例模式的设计思想及其应用。首先阐述了单例模式的基本概念、特点与定义,并探讨其适用场景与常见问题。接着深入分析了为何使用单例模式,包括处理资源访问冲突和表示全局唯一类。随后详细讲解了几种常见的单例实现方式,如饿汉式、懒汉式、双重检查锁定、静态内部类及枚举等,对比了各自优缺点。最后讨论了单例模式可能带来的问题,如对OOP不友好、隐藏依赖关系、扩展性差等,并提出了一些替代解决方案。文章内容丰富,适合希望深入了解单例模式及其应用的读者。
58 1
|
11月前
|
【设计模式】单例模式的三种实现方式
【设计模式】单例模式的三种实现方式
70 1
单例模式设计(一)
饿汉模式 由名字我们就可以知道 "饿汉" 嘛,就比较急切,在类加载的时候就创建实例: 1. 写一个类,在本类中构造实例,用static修饰,直接创建出来(提供一个现有的实例) 2. 在本类中写一个方法获取到上面的实例 3. 将这个类的构造方法设置为私有的,让外部不能 new 这个对象
69 0
|
11月前
|
创建型 单例模式
创建型 单例模式
57 1
二十三种设计模式:单例模式
在这个代码中,我们定义了一个名为Singleton的类,其中包含一个私有的静态指针instance,用于存储单例对象的唯一实例。构造函数被私有化,这意味着外部无法直接实例化Singleton类的对象。我们通过getInstance()方法来获取Singleton类的唯一实例,如果instance指针为空,则创建一个新的Singleton对象并将其赋值给instance指针。最后,我们定义了一个doSomething()方法,用于执行单例类的具体操作。
70 0
单例模式是一种创建型设计模式
单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。
66 0