Java单例模式:懒汉与饿汉模式解析
113 浏览量
更新于2024-09-09
收藏 75KB PDF 举报
Java单例模式是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁实例化然后销毁的对象,或者创建对象需要消耗大量资源的情况中非常有用,可以节省内存并提高性能。
懒汉模式是单例模式的一种实现方式,它的特点是延迟加载,即只有当首次使用时才会创建单例对象。然而,原始的懒汉模式在多线程环境中存在线程安全问题。为了解决这个问题,我们通常采用单重检查(Double-Check Locking)策略来优化懒汉模式。
单重检查锁定的懒汉模式代码如下所示:
```java
public class LazySingleton {
private static volatile LazySingleton singletonInstance = null;
private Object data = new Object();
// 私有化构造方法
private LazySingleton() {}
// 加锁访问
public static LazySingleton getInstance() {
if (singletonInstance == null) {
synchronized (LazySingleton.class) {
if (singletonInstance == null) {
singletonInstance = new LazySingleton();
}
}
}
return singletonInstance;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
```
这里的关键在于`volatile`关键字,它确保了多线程环境下的可见性和有序性,使得多个线程能正确地看到初始化后的`singletonInstance`。在`getInstance()`方法中,先进行一次非同步的检查,如果`singletonInstance`为`null`,才进入同步块进行二次检查。这是因为即使在第一次检查后、第二次检查前,其他线程创建了单例,第二次检查依然会检测到,避免重复创建。
测试代码创建了10个线程,每个线程调用`getInstance()`获取单例对象并打印其数据。由于单例模式的特性,所有线程都将得到相同的`LazySingleton`实例,所以打印的数据地址相同。
饿汉模式则是在类加载时就立即创建单例对象,确保了线程安全,但牺牲了延迟加载的优点。代码如下:
```java
public class EagerSingleton {
private static final EagerSingleton INSTANCE = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return INSTANCE;
}
}
```
饿汉模式在类装载时就完成了初始化,所以类加载速度较慢,但避免了同步,提高了效率。
总结来说,Java单例模式有多种实现方式,包括懒汉模式和饿汉模式,其中懒汉模式又可进一步优化为单重检查锁定,以兼顾线程安全和延迟加载。选择哪种模式取决于具体的应用场景和性能需求。
2016-12-20 上传
2011-10-25 上传
2023-05-31 上传
2023-05-11 上传
2023-05-30 上传
2023-08-24 上传
2023-05-19 上传
2023-06-09 上传
2023-03-23 上传
weixin_38740848
- 粉丝: 6
- 资源: 888
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展