【设计模式】【创建型5-1】【单例模式】

文章目录

单例模式

懒汉模式

java 复制代码
/***
 * 单例 懒汉模式
 * 使用的时候再创建实例
 * 线程不安全
 */
public class LazeSingle {

    private static LazeSingle lazeSingle;

    public LazeSingle() {
    }

    public static LazeSingle getLazeSingle() {
        if (lazeSingle == null) {
            lazeSingle = new LazeSingle();
        }
        return lazeSingle;
    }
}

饿汉模式

java 复制代码
/***
 * 饿汉模式 线程安全
 * 加载的时候就实例化了
 */
public class HungrySingle {
    private static HungrySingle hungrySingle = new HungrySingle();

    public static HungrySingle getHungrySingle(){
        return hungrySingle;
    }
}

双重锁校验的单例模式

为什么要做双重锁校验

代码中 假设两个线程 都通过了第一判空 阻塞在synchronized锁上 其中一个获取锁成功 另外一个阻塞,

此时 第一个创建了新的对象返回 如果没有第二次判空校验 那么 第二个会在第一个释放锁以后 重新创建对象 这就是有问题的 此时如果有判空的话 可以避免此场景

java 复制代码
/***
 * 双重锁校验的单例模式 线程安全
 */
public class DoubleLockSingle {

    private static volatile DoubleLockSingle doubleLockSingle;

    public DoubleLockSingle() {
    }
    public static DoubleLockSingle getDoubleLockSingle() {
        if (doubleLockSingle == null) {
            synchronized (DoubleLockSingle.class) {
                if (doubleLockSingle == null) {
                    doubleLockSingle = new DoubleLockSingle();
                }
            }
        }
        return doubleLockSingle;
    }
}

枚举单例

  1. 线程安全:枚举单例模式在创建实例时自动处理线程同步问题,因此您无需担心多线程环境下的竞争条件。
  2. 序列化安全:枚举单例模式在序列化和反序列化过程中保持单例特性。这意味着,当您将单例对象序列化到磁盘并再次读取时,您将获得相同的实例。
  3. 简洁性:与其他单例模式实现相比,枚举单例模式更简洁,易于理解。您只需创建一个枚举类型,并将实例定义为枚举常量。
java 复制代码
public enum SingleEnum {
    INSTANCE;
    private final Object obj;

    SingleEnum() {
        this.obj = new Object();
    }
    public Object getString() {
        return obj;
    }
}

    public static void main(String[] args) {
        SingleEnum instance = SingleEnum.INSTANCE;
        SingleEnum instance2 = SingleEnum.INSTANCE;
        System.out.println(instance);
        System.out.println(instance2);
        System.out.println(instance.getString());
        System.out.println(instance2.getString());
    }
/* 打印结果
INSTANCE
INSTANCE
java.lang.Object@707f7052
java.lang.Object@707f7052 */

单例模式在实际开发中的应用

作为配置类存在。

一般配置只能有一份。

作为缓存存在。

比如要在内存里记录一些东西。可能使用饿汉模式直接存储。

线程池。

使用双重锁校验模式,创建线程池。

相关推荐
Carl_奕然3 小时前
【智能体】Agent的四种设计模式之:React(2026最新版)
javascript·人工智能·python·react.js·设计模式·语言模型
cfm_29143 小时前
Spring核心设计模式
java·spring·设计模式
今天会营业5 小时前
单例模式:饿汉和懒汉
单例模式
小小晓.1 天前
C++单例模式万字详解:6种实现演进+线程安全彻底解决+CRTP终极模板
c++·单例模式
码匠许师傅1 天前
【设计模式精讲】15.享元模式(Flyweight)
c++·设计模式·享元模式·uml
事圆则缓1 天前
Android 常用设计模式速查
android·设计模式
码匠许师傅2 天前
【设计模式精讲】14.外观模式(Facade)
c++·设计模式·uml·外观模式
evans在进步2 天前
Java 常用设计模式(二):装饰器、适配器、责任链、模板方法、策略与观察者
java·开发语言·设计模式
码匠许师傅2 天前
【设计模式精讲】13.装饰器模式(Decorator)
c++·设计模式·uml·装饰器模式
软件黑马王子2 天前
3.单例模式问题1:构造函数
开发语言·单例模式·c#