系列一、 单例设计模式

一、单例设计模式

1.1、概述

单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建者模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

1.2、应用场景

只需要一个实例,例如:各种Manager、各种Factory

二、单例模式的结构

2.1、单例模式主要有以下角色

  • 单例类:只能创建一个实例的类
  • 访问类:使用单例类

2.2、单例模式的实现

  • 饿汉式:类加载就会导致该单例对象被创建
  • 懒汉式:类加载不会导致该单例对象被创建,当首次使用该对象时才会创建

2.3、单例模式-饿汉式

2.3.1、静态成员变量

java 复制代码
public class SingletonDemo1 {

    // 1、私有构造方法
    private SingletonDemo1() {
    }

    // 2、在当前类中创建本类对象
    private static SingletonDemo1 instance = new SingletonDemo1();

    // 3、对外提供获取本类实例对象的公共访问方式
    public static SingletonDemo1 getInstance() {
        return instance;
    }
}

2.3.2、静态代码块

java 复制代码
public class SingletonDemo2 {

    // 1、私有构造方法
    private SingletonDemo2() {

    }

    // 2、在当前类中声明当前类的类型变量
    private static SingletonDemo2 instance;

    // 3、在静态代码块中进行赋值
    static {
        instance = new SingletonDemo2();
    }

    // 4、对外提供获取该类对象的方法
    public static SingletonDemo2 getInstance() {
        return instance;
    }

}

2.3.3、存在的问题

由于对象的创建是随着类的加载而创建,所以存在内存浪费的问题。

2.4、单例模式-懒汉式

2.4.1、线程不安全

java 复制代码
/**
 * 
 * @Description 懒汉式:线程不安全
 * 存在的问题:多线程情况下,会创建多个实例
 */
public class SingletonDemo3 {

    // 1、私有构造方法
    private SingletonDemo3() {

    }

    // 2、在当前类中声明当前类的类型变量
    private static SingletonDemo3 instance; // 这是声明了一个该类型的变量,并没有进行赋值

    // 3、对外提供获取该类对象的方法
    public static SingletonDemo3 getInstance() {
        if (instance == null) {
            instance = new SingletonDemo3();
        }
        return instance;
    }
}

2.4.2、线程安全

java 复制代码
/**
 * @Description 懒汉式:线程安全
 * 存在的问题:
 *      对于getInstance()方法来说,绝大部分的操作都是读操作,读操作是线程安全的,所以我们没必要让每个线程必须持有锁才能调用该方法,
 *   而且加锁在多线程场景下,会严重影响性能。
 */
public class SingletonDemo4 {

    // 1、私有构造方法
    private SingletonDemo4() {

    }

    // 2、在当前类中声明当前类的类型变量
    private static SingletonDemo4 instance; // 这是声明了一个该类型的变量,并没有进行赋值

    // 3、对外提供获取该类对象的方法
    public static synchronized SingletonDemo4 getInstance() {
        if (instance == null) {
            instance = new SingletonDemo4();
        }
        return instance;
    }

}

2.4.3、双重锁检查机制【推荐】

java 复制代码
/**
 * @Description 懒汉模式:双重锁检查机制
 */
public class SingletonDemo5 {
    // 1、私有构造方法
    private SingletonDemo5() {

    }

    /**
     * 2、在当前类中声明当前类的类型变量
     * 说明:添加volatile关键字之后的双重检查锁模式是一种比较好的单例实现模式,能够保证在多线程的情况下线程安全,
     * 并且不会影响性能。
     */
    private static volatile SingletonDemo5 instance; // 这是声明了一个该类型的变量,并没有进行赋值

    // 3、对外提供获取该类对象的方法
    public static SingletonDemo5 getInstance() {
        // 3.1、第一次判断,如果instance不为null,不需要抢占资源,直接返回
        if (instance == null) {
            synchronized (SingletonDemo5.class) {
                // 3.2、第二次判断
                if (instance == null) {
                    instance = new SingletonDemo5();
                }
            }
        }
        return instance;
    }
}
相关推荐
workflower7 小时前
例二:某汽车制造企业深度融合AI智能体,构建园区网络的智能运维体系
人工智能·机器学习·设计模式·机器人·云计算·汽车·制造
ly76898 小时前
Java 设计模式详解:从原则到 23 种经典模式
java·开发语言·设计模式
AI人工智能+电脑小能手11 小时前
大白话说Java设计模式-14-适配器模式(业务实战篇)
java·设计模式·适配器模式·系统兼容·多渠道对接
略略略咯咯19 小时前
(总结)设计模式
设计模式
Cosolar1 天前
DeepSeek Harness 理解 Harness 的设计哲学 - 可组合的插件运行时
人工智能·设计模式·架构
Nebula_g1 天前
JavaSE基础语法:特殊类(特殊情景下的设计模式)
java·开发语言·设计模式
George_Ye2 天前
同一本书,一人一份:我如何设计 AI 个性化扫书报告
设计模式
莫得感情 o2 天前
设计模式 22 · 三个冷门模式:中介者、访问者、解释器
java·设计模式
AI人工智能+电脑小能手3 天前
大白话说Java设计模式-08-建造者模式(业务实战篇)
java·设计模式·建造者模式·架构设计·对象构建
AustinXu3 天前
从 Claude Code 到 Claude Tag,Harness Engineering 走到了组织这一层
设计模式·团队管理