Java实现Singleton单例模式详解
需积分: 0 54 浏览量
更新于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 上传
2017-01-16 上传
2019-03-16 上传
2010-06-21 上传
2021-12-14 上传
2015-08-10 上传
2016-07-14 上传
2016-09-02 上传
ask_ai_app
- 粉丝: 24
- 资源: 326
最新资源
- Raspberry Pi OpenCL驱动程序安装与QEMU仿真指南
- Apache RocketMQ Go客户端:全面支持与消息处理功能
- WStage平台:无线传感器网络阶段数据交互技术
- 基于Java SpringBoot和微信小程序的ssm智能仓储系统开发
- CorrectMe项目:自动更正与建议API的开发与应用
- IdeaBiz请求处理程序JAVA:自动化API调用与令牌管理
- 墨西哥面包店研讨会:介绍关键业绩指标(KPI)与评估标准
- 2014年Android音乐播放器源码学习分享
- CleverRecyclerView扩展库:滑动效果与特性增强
- 利用Python和SURF特征识别斑点猫图像
- Wurpr开源PHP MySQL包装器:安全易用且高效
- Scratch少儿编程:Kanon妹系闹钟音效素材包
- 食品分享社交应用的开发教程与功能介绍
- Cookies by lfj.io: 浏览数据智能管理与同步工具
- 掌握SSH框架与SpringMVC Hibernate集成教程
- C语言实现FFT算法及互相关性能优化指南