Java实现Singleton单例模式详解
需积分: 0 24 浏览量
更新于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时才会进入同步块创建实例,降低了同步的开销。
单例模式是一种强大的设计模式,它在适当的时候提供了唯一的实例,控制了对象的生命周期,并优化了资源使用。在实际开发中,开发者应根据具体需求选择合适的单例实现方式。
点击了解资源详情
点击了解资源详情
248 浏览量
167 浏览量
117 浏览量
217 浏览量
719 浏览量
1379 浏览量
293 浏览量
ask_ai_app
- 粉丝: 24
- 资源: 326
最新资源
- 花式滑块分配
- vue-editor.md.zip
- shoukakkou:具有社交功能的地图工具
- 鲸鱼优化算法WOA实现函数极值寻优python.rar
- symbol-openapi-generator:为Symbol SDK生成并部署OpenAPI生成的客户端库
- mono-gaussian-processes:单调和单峰高斯过程的Stan模拟
- pubg:简单干净的pubg播放器统计数据和比赛跟踪器
- EZDML for linux64 V3.01版
- dsa:DSA Spring'21
- XX经营管理思路及目标汇报
- Unity3d-Finite-State-Machine:直观的Unity3d有限状态机(FSM)。 在不牺牲实用性的情况下着重于可用性的设计
- ChatStats:获取有关您的Facebook群聊的统计信息
- rasa_flight
- EZDML for mac64 V3.01版
- lct-ui:LCT v4 用户界面
- blendercolorize