Java中三种单例模式详解及实例
需积分: 50 104 浏览量
更新于2024-10-30
收藏 4KB TXT 举报
本文将介绍几种常见的Java单例模式,并通过实例进行详细解析,包括饿汉式、懒汉式和双重检查锁定模式。
在软件设计模式中,单例模式是一种常用的创建型模式,它保证一个类只有一个实例,并提供全局访问点。这样的设计模式在系统中经常用于控制资源的共享,比如数据库连接池、线程池等。
1. 饿汉式(Eager Singleton)
饿汉式单例在类加载时就完成了实例化,确保了线程安全。实例在类加载时已经创建,因此不会有任何性能问题,但是无论是否使用,都会立即创建对象,可能导致内存浪费。
示例代码:
```java
public class EagerSingleton {
private static final EagerSingleton m_instance = new EagerSingleton();
private EagerSingleton() {} // 构造函数私有化,防止外部实例化
public static EagerSingleton getInstance() {
return m_instance;
}
}
```
在这个例子中,`m_instance` 在类加载时被初始化,所以 `getInstance()` 方法总是返回同一个实例。
2. 懒汉式(Lazy Singleton)
懒汉式单例在第一次调用 `getInstance()` 方法时才进行实例化,延迟了对象的创建,从而实现了按需加载。但是,原始的懒汉式单例在多线程环境下并不安全,可能会创建多个实例。
示例代码(非线程安全):
```java
public class LazySingleton {
private static LazySingleton m_instance = null;
private LazySingleton() {} // 构造函数私有化
public static synchronized LazySingleton getInstance() {
if (m_instance == null) {
m_instance = new LazySingleton();
}
return m_instance;
}
}
```
虽然这个版本的懒汉式在多线程环境中是安全的,但 `getInstance()` 方法每次调用都加锁,降低了性能。
3. 双重检查锁定模式(Double-Checked Locking,DCL)
双重检查锁定模式结合了懒汉式的延迟加载和饿汉式的线程安全性,它在创建单例对象时仅加锁一次,提高了效率。
示例代码(线程安全):
```java
public class DoubleCheckSingleton {
private volatile static DoubleCheckSingleton m_instance = null;
private DoubleCheckSingleton() {}
public static DoubleCheckSingleton getInstance() {
if (m_instance == null) { // 第一次检查
synchronized (DoubleCheckSingleton.class) {
if (m_instance == null) { // 第二次检查,避免不必要的同步
m_instance = new DoubleCheckSingleton();
}
}
}
return m_instance;
}
}
```
在这个例子中,`volatile` 关键字确保了 `m_instance` 的可见性和有序性,防止出现指令重排序问题,确保了多线程环境下的正确性。
总结,单例模式在设计上提供了对类实例的唯一控制,有助于节省系统资源和简化全局访问。不同的实现方式在性能和线程安全上有所区别,开发者应根据实际需求选择合适的单例模式。
486 浏览量
2019-08-14 上传
311 浏览量
115 浏览量
261 浏览量
232 浏览量
330 浏览量
![](https://profile-avatar.csdnimg.cn/eff5c1098b694f6ba015dd002a147640_zx511098425.jpg!1)
zx511098425
- 粉丝: 0
最新资源
- VC++多线程与网络编程实战:进程与线程,Winsock基础
- VC++对话框与标准控件详解:模式对话框与编程入门
- 深入理解MFC应用程序:框架与消息处理
- 深入理解VC++动态链接库(DLL):原理与实战
- 运用软件工程思想开发扫雷游戏
- Windows Server 2003服务器群集配置实战指南
- Ruby 技巧解析:面向 Rails 开发者
- Shell编程入门指南:从Cygwin到Bash命令
- Linux环境下的C++编程实践与库对比
- Protel99使用指南:从安装到原理图设计
- ActionScript 3 RIA 开发权威指南
- 提升全文检索速度的有序单词搜索树与索引文件压缩算法
- Visual C# 中创建系统热键的方法
- AT91SAM7A3 ARM处理器数据手册详解
- SAS宏基础教程:文本操作与变量控制
- 固件开发必备:如何高效阅读DataSheet