Java 单例模式与线程安全

devtools/2025/3/23 18:32:39/

Java 单例模式与线程安全

单例模式(Singleton Pattern)是设计模式中最简单且常用的模式之一,它确保一个类只有一个实例,并提供一个全局访问点。单例模式在许多场景中非常有用,例如配置管理、线程池、缓存等。然而,在多线程环境下,单例模式的实现可能会遇到线程安全问题。本文将探讨如何在 Java 中实现单例模式,并确保其线程安全

单例模式的基本实现

1. 懒汉式单例

懒汉式单例是指在第一次使用时才创建实例。以下是一个简单的懒汉式单例实现:

java">public class LazySingleton {private static LazySingleton instance;private LazySingleton() {// 私有构造函数}public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}

2. 饿汉式单例

饿汉式单例是指在类加载时就创建实例。以下是一个简单的饿汉式单例实现:

java">public class EagerSingleton {private static final EagerSingleton instance = new EagerSingleton();private EagerSingleton() {// 私有构造函数}public static EagerSingleton getInstance() {return instance;}
}

单例模式的线程安全问题

在多线程环境下,懒汉式单例的实现可能会导致多个线程同时创建多个实例,从而破坏单例模式的唯一性。例如,在以下情况下:

java">if (instance == null) {instance = new LazySingleton();
}

如果两个线程同时进入 if 语句,它们都会创建一个新的实例,从而导致单例模式失效。

线程安全单例模式实现

1. 使用 synchronized 关键字

最简单的线程安全实现方式是在 getInstance 方法上添加 synchronized 关键字,确保同一时间只有一个线程可以进入该方法:

java">public class SynchronizedSingleton {private static SynchronizedSingleton instance;private SynchronizedSingleton() {// 私有构造函数}public static synchronized SynchronizedSingleton getInstance() {if (instance == null) {instance = new SynchronizedSingleton();}return instance;}
}

虽然这种方法可以确保线程安全,但每次调用 getInstance 方法时都会进行同步,这会导致性能下降。

2. 双重检查锁定(Double-Checked Locking)

为了减少同步的开销,可以使用双重检查锁定机制。这种机制在第一次检查时不需要同步,只有在实例未创建时才进行同步:

java">public class DoubleCheckedSingleton {private static volatile DoubleCheckedSingleton instance;private DoubleCheckedSingleton() {// 私有构造函数}public static DoubleCheckedSingleton getInstance() {if (instance == null) {synchronized (DoubleCheckedSingleton.class) {if (instance == null) {instance = new DoubleCheckedSingleton();}}}return instance;}
}

需要注意的是,instance 变量必须使用 volatile 关键字修饰,以确保多线程环境下的可见性。

3. 静态内部类实现

静态内部类实现是一种既简单又线程安全单例模式实现方式。它利用了类加载机制来保证初始化实例时只有一个线程:

java">public class StaticInnerClassSingleton {private StaticInnerClassSingleton() {// 私有构造函数}private static class SingletonHolder {private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();}public static StaticInnerClassSingleton getInstance() {return SingletonHolder.INSTANCE;}
}

在这种实现中,SingletonHolder 类只有在 getInstance 方法被调用时才会被加载,从而实现了懒加载的效果。

4. 枚举实现

枚举实现是一种简洁且线程安全单例模式实现方式。枚举类型在 Java 中本身就是单例的,因此可以直接使用枚举来实现单例模式

java">public enum EnumSingleton {INSTANCE;public void doSomething() {// 业务逻辑}
}

枚举实现的单例模式不仅线程安全,而且可以防止反射和序列化破坏单例。

总结

单例模式是设计模式中最常用的模式之一,但在多线程环境下,实现线程安全单例模式需要考虑多种因素。本文介绍了几种常见的线程安全单例模式实现方式,包括使用 synchronized 关键字、双重检查锁定、静态内部类和枚举实现。每种实现方式都有其优缺点,开发者应根据具体需求选择合适的实现方式。

在实际开发中,推荐使用静态内部类或枚举实现单例模式,因为它们既简单又线程安全,且不需要额外的同步机制。


http://www.ppmy.cn/devtools/169044.html

相关文章

蓝桥杯嵌入式组第十二届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之,藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 LED模块1.3.3 LCD模块1.3.4 TIM模块1.3.5 UART模块1.3.5.1 uart数据解析 2.源码3.第十二届题目 前言:STM32G431RBT6实现嵌入式组第十二届题目解析源码&#…

网络安全设备配置与管理-实验4-防火墙AAA服务配置

实验4-p118防火墙AAA服务配置 从这个实验开始,每一个实验都是长篇大论😓 不过有好兄弟会替我出手 注意:1. gns3.exe必须以管理员身份打开,否则ping不通虚拟机。 win10虚拟机无法做本次实验,必须用学校给的虚拟机。首…

《数字图像处理》第三章 灰度变换与空间滤波学习笔记(3.1-3.2)反转、对数、幂律、分段线性等变换

请注意:笔记内容片面粗浅,请读者批判着阅读! 3.1 背景知识:空间域处理基础 核心概念解析 空间域定义 空间域指图像平面本身,其处理直接作用于像素矩阵(区别于频率域的变换处理)。 数学表达式:…

Spring MVC 接口数据

访问路径设置 RequestMapping("springmvc/hello") 就是用来向handlerMapping中注册的方法注解! 秘书中设置路径和方法的对应关系,即RequestMapping("/springmvc/hello"),设置的是对外的访问地址, 路径设置 精准路径匹…

Spark DataFrame、Dataset 和 SQL 解析原理深入解析(万字长文多张原理图)

目录 1. Spark SQL 概述 1.1 Spark 整体架构概览 1.2 DataFrame 与 Dataset 简介 2. RDD 与 Spark 的分布式架构基础 2.1 弹性分布式数据集(RDD) 2.2 Spark 的分布式执行模型 3. SQL 解析流程与 Catalyst 优化器 3.1 SQL 解析流程概述 3.2 解析阶段与抽象语法树(AST…

去中心化交易所与中心化交易所的差异

在2025年数字货币市场爆发式增长的背景下,去中心化交易所(DEX)与中心化交易所(CEX)的竞争已从技术维度延伸至金融治理范式层面。两者的差异不仅体现在资产托管方式,更折射出对金融权力分配、风险控制逻辑和…

[HelloCTF]PHPinclude-labs超详细WP-Level 1-FILE协议

源码分析 <?php include("get_flag.php");isset($_GET[wrappers]) ? include("file://".$_GET[wrappers]) : ;highlight_file(__FILE__); ?>第一句 include("get_flag.php");, 使代码包含了 get_flag.php 的内容 大概是生成 Flag 之类的…

昆仑万维开源R1V:38B参数多模态推理模型开启AI新纪元

在AI技术竞争白热化的今天&#xff0c;中国公司昆仑万维以一场震撼的开源行动&#xff0c;向全球展示了其在多模态推理领域的突破。R1V&#xff08;Skywork R1V&#xff09;——全球首个工业级开源多模态推理模型&#xff0c;以380亿参数规模直逼DeepSeek-R1的推理能力&#xf…