单例模式(线程安全)

1.什么是单例模式

单例模式(Singleton Pattern)是一种创建型设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。

注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例

2.单例模式怎么实现

2.1 饿汉模式

饿汉模式 顾名思义 就是非常急切 所以它在类加载过程中就会生成实例

同时 构造方法中也可根据需要进行传参。

public class Singleton {

private static Singleton instance = new Singleton();

private Singleton() {}

public static Singleton getInstance() {

return instance;

}

}

饿汉式在类加载时就创建实例,因此线程安全,但可能会浪费内存

2.2 懒汉模式

懒汉是 尽可能晚的去创建实例 延迟创建

就比如看小说一样是加载下一页时候创建下一页 而不是上来就全部加载 那样太浪费空间

public class Singleton {

private static Singleton instance;

private Singleton() {}

public static synchronized Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

单例模式的创建不只有两种模式 其他的不常用不过多涉及

3.单例模式下的线程安全

饿汉式在类加载时就创建实例,因此线程安全,但可能会浪费内存

懒汉式在需要时才创建实例,但需要加锁以确保线程安全

由此看出我们懒汉模式是不安全 的

因此我们不难想到使用加锁的方式来使得线程安全

但是如果每次运行都要加锁那将大大降低运行效率

因此我们做一下优化

在单线程中 1 2 3还是1 3 2 都是无关紧要的 但是当在多线程中 这就会成为bug

因此我们可以借助volatile 来解决内存可见性问题

volatile 的功能有两方面

1.确保每次读取操作 都在读内存

2.关于该变量的读取 修改操作不会触发重排序

4.单例模式的优缺点

优点:

  1. 内存节省:在内存中只有一个实例,减少了内存开销。

  2. 资源管理:避免对资源的多重占用,如文件操作。

缺点:

  1. 不易扩展:没有接口,不能继承。

  2. 与单一职责原则冲突:一个类应该只关心内部逻辑,而不关心实例化方式。

5.使用场景

单例模式适用于以下场景:

  1. 唯一序列号生成。

  2. 全局计数器。

  3. 资源消耗大的对象,如数据库连接。

相关推荐
wangbing11251 小时前
springboot应用关闭时触发动作
java·spring boot·后端
weixin_460443565 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w8 小时前
什么是AOP
java
Cc.Y8 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck8 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787058 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev8 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
Sarvartha8 小时前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞8 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计
colinu9 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++