Java单例模式深度解析:9种实现方式
148 浏览量
更新于2024-09-03
收藏 70KB PDF 举报
"这篇文章主要详细解析了9种Java单例模式,内容涵盖了单例模式的基本特点和实现方式,包括线程安全与非安全的各种场景。文章适合Java初学者和开发者学习提升,旨在帮助理解单例模式的应用和实现细节。"
在软件设计模式中,单例模式是一种常用的模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于可以节约系统资源,尤其是在创建对象成本较高的情况下。以下是对9种Java单例模式的详细说明:
1. 懒汉式(线程不安全):
这是最基础的实现方式,通过延迟加载(Lazy Loading)实现。当首次需要单例对象时才进行实例化。缺点是多线程环境下可能导致多个实例的创建。
```java
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getSingleton() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
```
2. 懒汉式(线程安全,同步方法):
为了解决上述问题,可以在`getSingleton()`方法上添加`synchronized`关键字,确保同一时间只有一个线程能执行。但这样做会降低性能,因为每次调用都会进行同步,即使单例已经创建。
```java
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static synchronized Singleton getSingleton() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
```
3. 饿汉式(线程安全):
在类加载时就完成初始化,因此是线程安全的。这种实现方式牺牲了延迟加载,但在多线程环境中非常可靠。
```java
public class Singleton {
private static final Singleton singleton = new Singleton();
private Singleton() {}
public static Singleton getSingleton() {
return singleton;
}
}
```
4. 双重检查锁定(DCL,线程安全):
结合了懒汉式和饿汉式的优点,既延迟加载,又保证了线程安全性。通过两次检查避免不必要的同步。
```java
public class Singleton {
private volatile static Singleton singleton;
private Singleton() {}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
```
5. 静态内部类(线程安全):
利用Java类加载机制保证初始化实例时只有一个线程,且只实例化一次。
```java
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getSingleton() {
return SingletonHolder.INSTANCE;
}
}
```
6. 枚举单例(线程安全,推荐使用):
最简洁、最安全的方式,由JVM保证线程安全,且防止反序列化重新创建新的实例。
```java
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
```
7. 延迟初始化器(类初始化器,线程安全):
使用`java.lang.Initializer`来延迟初始化,适用于需要在JVM启动后才初始化的场景。
8. 注解驱动单例(Spring框架):
在Spring框架中,可以通过注解`@Singleton`声明一个bean为单例。
9. 模块化单例(OSGi):
在OSGi环境下,可以通过服务注册和查找机制实现模块间的单例共享。
以上就是9种Java单例模式的详解,每种方式都有其适用场景和优缺点。选择哪种方式取决于具体的需求,如性能、线程安全、延迟加载等。理解并熟练掌握这些模式,对于编写高效、可靠的Java代码至关重要。
2011-03-01 上传
2012-06-14 上传
2020-07-21 上传
2021-04-27 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38748875
- 粉丝: 10
- 资源: 951
最新资源
- Raspberry Pi OpenCL驱动程序安装与QEMU仿真指南
- Apache RocketMQ Go客户端:全面支持与消息处理功能
- WStage平台:无线传感器网络阶段数据交互技术
- 基于Java SpringBoot和微信小程序的ssm智能仓储系统开发
- CorrectMe项目:自动更正与建议API的开发与应用
- IdeaBiz请求处理程序JAVA:自动化API调用与令牌管理
- 墨西哥面包店研讨会:介绍关键业绩指标(KPI)与评估标准
- 2014年Android音乐播放器源码学习分享
- CleverRecyclerView扩展库:滑动效果与特性增强
- 利用Python和SURF特征识别斑点猫图像
- Wurpr开源PHP MySQL包装器:安全易用且高效
- Scratch少儿编程:Kanon妹系闹钟音效素材包
- 食品分享社交应用的开发教程与功能介绍
- Cookies by lfj.io: 浏览数据智能管理与同步工具
- 掌握SSH框架与SpringMVC Hibernate集成教程
- C语言实现FFT算法及互相关性能优化指南