单例模式--懒汉 饿汉模式

一.啥是单例模式?

先介绍一下设计模式:

设计模式好⽐象棋中的 "棋谱". 红⽅当头炮, ⿊⽅⻢来跳. 针对红⽅的⼀些⾛法, ⿊⽅应招的时候有⼀些固定的套路. 按照套路来⾛局势就不会吃亏.
软件开发中也有很多常⻅的 "问题场景". 针对这些问题场景, ⼤佬们总结出了⼀些固定的套路. 按照这个套路来实现代码, 也不会吃亏.

单例模式能保证某个类在程序中只存在唯⼀⼀份实例, ⽽不会创建出多个实例.

这种情况就存在了两份实例

单例模式具体的实现⽅式有很多. 最常⻅的是 "饿汉" 和 "懒汉" 两种

二.饿汉模式

实现步骤:

1.要实现单例模式,只需要定义一个静态全局变量,这样就可以保证变量全局唯一。

复制代码
private static Singleton instance= new Singleton();

private:保证这个变量不可修改。

static:保证全局唯一

2.构造方法私有化

复制代码
private Singleton() {
    }

这样就保证了外界无法通过构造方法创建对象

3.将获取instance的方法用static修饰,使其可以通过类.方法名调用。

复制代码
public static Singleton getInstance() {
        return instance;
    }

public class Singleton {
    private static Singleton instance= new Singleton();
    //构造方法私有化
    private Singleton() {
    }
    public static Singleton getInstance() {
        return instance;
    }
}

这种在类加载时就完成初始化对象的模式称为"饿汉模式"。

三.懒汉模式

1.只声明全局变量,不初始化

复制代码
​​​​​​​private static Singleton_02 instance = null;

2.获取instance时进行if判断,为null再初始化

复制代码
public static Singleton_02 getInstance() {
          if(instance == null) {
             instance = new Singleton_02();
          }
     return instance;
 }

private static Singleton_02 instance = null;
    private Singleton_02() {

    }
    public static Singleton_02 getInstance() {
        if(instance == null) {
            instance = new Singleton_02();
        }
        return instance;
    }

这样创建在单线程运行没问题

但在多线程模式下:

这里暂停1s是为了让线程全部进入if语句

可能会出现问题

因此,要解决这个线程问题,使用新学的synchronized,volatile关键字

复制代码
private static volatile Singleton_02 instance = null;
    private Singleton_02() {

    }
    public static Singleton_02 getInstance() {
        if(instance == null) {
            synchronized(Singleton_02.class) {
                if(instance == null) {
                    instance = new Singleton_02();
                }
            }
        }
        return instance;
    }
相关推荐
lbh3 小时前
当我开始像写代码一样和AI对话,一切都变了
前端·openai·ai编程
We་ct4 小时前
LeetCode 918. 环形子数组的最大和:两种解法详解
前端·数据结构·算法·leetcode·typescript·动态规划·取反
qq_406176144 小时前
深入浅出 Pinia:Vue3 时代的状态管理新选择
javascript·vue.js·ecmascript
wefly20175 小时前
m3u8live.cn 在线M3U8播放器,免安装高效验流排错
前端·后端·python·音视频·前端开发工具
C澒5 小时前
微前端容器标准化 —— 公共能力篇:通用打印
前端·架构
德育处主任Pro5 小时前
前端元素转图片,dom-to-image-more入门教程
前端·javascript·vue.js
木斯佳5 小时前
前端八股文面经大全:小红书前端一二面OC(下)·(2026-03-17)·面经深度解析
前端·vue3·proxy·八股·响应式
陈天伟教授6 小时前
人工智能应用- 预测新冠病毒传染性:04. 中国:强力措施遏制疫情
前端·人工智能·安全·xss·csrf
叫我一声阿雷吧6 小时前
JS 入门通关手册(23):JS 异步编程:回调函数与异步本质
javascript·es6·前端面试·回调函数·回调地狱·js异步编程·异步本质
zayzy6 小时前
前端八股总结
开发语言·前端·javascript