
Java中三种单例模式详解及实例
下载需积分: 50 | 4KB |
更新于2024-10-30
| 199 浏览量 | 举报
收藏
本文将介绍几种常见的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` 的可见性和有序性,防止出现指令重排序问题,确保了多线程环境下的正确性。
总结,单例模式在设计上提供了对类实例的唯一控制,有助于节省系统资源和简化全局访问。不同的实现方式在性能和线程安全上有所区别,开发者应根据实际需求选择合适的单例模式。
相关推荐








zx511098425
- 粉丝: 0
最新资源
- C#实现的OCR字符识别技术源代码解析
- 千鸟浏览器:基于C#与Visual Studio.NET开发
- Apriori算法实现与VC图形化界面应用
- PL/SQL集成VSS版本控制插件使用指南
- SCEA SUN SL-425 认证培训教材分享
- 绿色软件在RLC电路特性分析中的应用
- C#图书馆管理系统:设计、安全与高效查询
- IIS V6.0安装包:全面支持Win2000、XP、2003操作系统
- C# ASP.NET实现TreeView动态数据绑定教程
- 数字图像处理习题参考答案解析
- Tomcat插件V3版本的下载与安装教程
- 清华王爱英《计算机组成与结构》第4版课件
- 文件句柄查看工具:权限、时间及属性一网打尽
- MapXtreme Web示例代码教程
- Java经典模拟售票系统程序实现分享
- PHP脚本语言教程资料大全
- 如何实现Workshop for WebLogic 10gR3与tomcat 6的集成
- VB6版本Blowfish加密算法完整实现:ECB与CBC模式及PKCS5标准
- ASP源代码企业OA办公系统功能介绍
- 百度全文搜索功能提升:实现关键字高亮显示
- Qt编程基础:窗口小部件与信号槽教程
- Fireworks平面设计教程:从基础到创意实践
- C#开发Vista透明时钟项目教程
- 压缩包子文件管理工具解析指南