深入理解:饿汉式与DCL懒汉式单例与CAS原理
需积分: 35 160 浏览量
更新于2024-08-12
收藏 8KB MD 举报
本文档主要探讨了单例模式在Java中的两种实现方式——饿汉式和懒汉式,以及如何结合CompareAndSet(CAS)技术来提高并发控制下的线程安全。单例模式是一种常用的软件设计模式,其目标是确保一个类只有一个实例,并提供全局访问点。本文将详细介绍这两种常见的单例模式实现及其特点。
### 1. **饿汉式单例**(Singleton via Singleton Field)
饿汉式是在类加载时就完成实例化,因此在程序启动时就预先创建了单例对象。示例代码中,`Hungry` 类的构造函数被声明为私有,以防止外部直接实例化。整个类被声明为静态且仅有一个`HUNGRY`实例。虽然这种方式能保证线程安全,但缺点是会消耗大量内存,因为所有实例都在类加载时初始化。
```java
private byte[] data1 = new byte[1024 * 1024]; // 内存消耗大
private byte[] data2 = new byte[1024 * 1024];
//...
private Hungry() {} // 私有构造函数
public static Hungry getInstance() { return HUNGRY; }
```
### 2. **懒汉式单例**(Singleton via Lazy Initialization)
懒汉式则是推迟实例化时间,直到第一次调用`getInstance()`方法。为了防止多线程同时实例化,这里采用了双重检查锁定(Double-Checked Locking)和`volatile`关键字来保证线程安全。当`lazyMan`字段为`null`时,才会进行同步块中的实例化操作,避免了不必要的同步开销。
```java
private static boolean chao = false;
private LazyMan() {
synchronized (LazyMan.class) {
if (chao == false) {
chao = true;
} else {
throw new RuntimeException("不要试图使用反射破坏异常");
}
}
}
private volatile static LazyMan lazyMan;
public static LazyMan getInstance() {
if (lazyMan == null) {
synchronized (LazyMan.class) {
if (lazyMan == null) {
lazyMan = new LazyMan(); // 原子性操作
}
}
}
return lazyMan;
}
```
### 3. **CompareAndSet (CAS) 应用**
CAS(Compare and Swap)算法是一种无锁数据结构操作,用于原子地更新某个变量值,如果当前值与预期值相等,则更新变量值,否则不做任何操作。在单例模式中,尽管懒汉式已经足够线程安全,但在某些特定场景(如缓存一致性、分布式系统等),可以考虑利用CAS优化并发控制,但这通常更适用于底层并发库的实现,而不是在单例模式中直接应用。
总结来说,文章深入讨论了单例模式的两种常见实现方式,并强调了在处理并发时考虑使用CAS技术来提高性能。同时,通过比较饿汉式和懒汉式的优缺点,帮助读者更好地理解何时选择哪种实现方式。对于高级并发编程者,理解和掌握这些概念对优化应用程序的性能和可维护性至关重要。
2015-06-17 上传
2022-06-02 上传
2023-05-12 上传
2023-06-01 上传
2023-06-08 上传
2023-06-06 上传
2023-09-26 上传
2024-01-23 上传
2023-05-15 上传
![](https://profile-avatar.csdnimg.cn/250e721dae78459ba280bd872ead68c4_repeated_ok.jpg!1)
追梦王子
- 粉丝: 4
- 资源: 11
最新资源
- 解决本地连接丢失无法上网的问题
- BIOS报警声音解析:故障原因与解决方法
- 广义均值移动跟踪算法在视频目标跟踪中的应用研究
- C++Builder快捷键大全:高效编程的秘密武器
- 网页制作入门:常用代码详解
- TX2440A开发板网络远程监控系统移植教程:易搭建与通用解决方案
- WebLogic10虚拟内存配置详解与优化技巧
- C#网络编程深度解析:Socket基础与应用
- 掌握Struts1:Java MVC轻量级框架详解
- 20个必备CSS代码段提升Web开发效率
- CSS样式大全:字体、文本、列表样式详解
- Proteus元件库大全:从基础到高级组件
- 74HC08芯片:高速CMOS四输入与门详细资料
- C#获取当前路径的多种方法详解
- 修复MySQL乱码问题:设置字符集为GB2312
- C语言的诞生与演进:从汇编到系统编程的革命