Java实现Singleton单例模式详解
需积分: 0 47 浏览量
更新于2024-08-04
收藏 890KB DOCX 举报
"本文将详细解释单例设计模式的核心概念及其两种常见的实现方式:饿汉式和懒汉式。"
单例模式是一种常用的软件设计模式,它的主要目标是确保一个类在整个应用程序中只有一个实例存在,并提供一个全局访问点来获取这个唯一的实例。这样做的好处包括节约系统资源、集中控制以及在多线程环境中避免并发问题。
首先,单例模式的关键特征体现在以下几个方面:
1. 唯一实例:类只能有一个实例,不允许其他地方再次创建该类的对象。
2. 构造器私有化:为了防止其他类通过构造函数直接创建对象,单例类的构造器通常被声明为私有的。
3. 静态变量存储实例:类内部通常包含一个静态变量来保存这个唯一的实例。
4. 全局访问点:提供一个公共的静态方法,用于获取这个唯一的实例。
在Java中,单例模式有两种常见的实现方式:
饿汉式(Eager Initialization):
在这种方式下,实例在类加载时就创建,无论何时何地,只要需要获取单例,都能立即得到。代码示例中,`INNER`静态变量在类加载时被初始化,所以`Person`类的实例在程序启动时就已经创建。饿汉式确保了线程安全,但可能会造成资源浪费,因为即使从未使用到单例,它也会被创建。
```java
public class Person {
public static final Person INNER;
static {
INNER = new Person();
}
private Person() {}
}
```
懒汉式(Lazy Initialization):
懒汉式则是在真正需要时才创建实例,即延迟初始化。在Java中,有一种线程安全的懒汉式实现是通过静态内部类,如代码所示,`Inner`静态内部类在第一次调用`getInstance()`方法时才加载,从而创建`Singleton`的实例。这种方式既保证了线程安全,又避免了不必要的资源消耗。
```java
public class Singleton {
private Singleton() {}
private static class Inner {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Inner.INSTANCE;
}
}
```
另一种常见的懒汉式实现是双重检查锁定(Double-Check Locking,DCL),确保在多线程环境下安全地创建单例。这种实现方式如下:
```java
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
```
在这个版本的懒汉式中,`volatile`关键字保证了多个线程之间的可见性,而双重检查确保了线程安全,只有在`instance`为null时才会进入同步块创建实例,降低了同步的开销。
单例模式是一种强大的设计模式,它在适当的时候提供了唯一的实例,控制了对象的生命周期,并优化了资源使用。在实际开发中,开发者应根据具体需求选择合适的单例实现方式。
144 浏览量
2012-06-15 上传
2023-04-21 上传
2023-05-01 上传
2023-04-21 上传
2024-03-01 上传
2023-06-02 上传
2023-05-18 上传
2024-03-14 上传
![](https://profile-avatar.csdnimg.cn/252ec56350504a7faa20f32856735a78_weixin_35735398.jpg!1)
ask_ai_app
- 粉丝: 24
- 资源: 326
最新资源
- 构建Cadence PSpice仿真模型库教程
- VMware 10.0安装指南:步骤详解与网络、文件共享解决方案
- 中国互联网20周年必读:影响行业的100本经典书籍
- SQL Server 2000 Analysis Services的经典MDX查询示例
- VC6.0 MFC操作Excel教程:亲测Win7下的应用与保存技巧
- 使用Python NetworkX处理网络图
- 科技驱动:计算机控制技术的革新与应用
- MF-1型机器人硬件与robobasic编程详解
- ADC性能指标解析:超越位数、SNR和谐波
- 通用示波器改造为逻辑分析仪:0-1字符显示与电路设计
- C++实现TCP控制台客户端
- SOA架构下ESB在卷烟厂的信息整合与决策支持
- 三维人脸识别:技术进展与应用解析
- 单张人脸图像的眼镜边框自动去除方法
- C语言绘制图形:余弦曲线与正弦函数示例
- Matlab 文件操作入门:fopen、fclose、fprintf、fscanf 等函数使用详解