Java单例模式全面解析:饿汉式、懒汉式、注册式与ThreadLocal
版权申诉
186 浏览量
更新于2024-09-11
收藏 103KB PDF 举报
"这篇资源详细介绍了Java中的单例模式,包括其定义、目的以及常见的四种实现方式:饿汉式、懒汉式、注册式(容器式和枚举式)和ThreadLocal式。单例模式的核心是确保类只有一个实例并提供全局访问点。文章通过实例代码展示了每种方式的优缺点及其工作原理。"
Java单例模式是一种设计模式,它旨在限制类的实例化,确保在整个应用程序中,某个类只有一个实例存在。这在需要频繁实例化然后销毁的对象,或昂贵资源的共享场景中特别有用。单例模式属于创建型设计模式,它的主要目的是控制类实例化的数量,减少内存消耗,并提供全局访问点。
一、饿汉式单例
饿汉式单例在类加载时即创建实例,因此是线程安全的。优点是无需同步,性能较好;缺点是无论是否需要,都会提前占用内存,可能导致资源浪费。例如:
```java
public class HungrySingleton {
private static final HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {}
public static HungrySingleton getInstance() { return instance; }
}
```
二、懒汉式单例
懒汉式单例延迟到首次需要时才创建实例,分为非线程安全的普通写法、使用`synchronized`关键字的线程安全写法以及双检锁(DCL,Double-Check Locking)写法。非线程安全的懒汉式在多线程环境下可能创建多个实例,而`synchronized`和DCL写法则能解决这个问题。例如,DCL写法如下:
```java
public class LazySingleton {
private volatile static LazySingleton instance;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
}
return instance;
}
}
```
三、注册式单例
注册式单例通常指的是通过容器(如Spring框架)来管理单例,可以实现依赖注入和生命周期管理。枚举单例是Java特有的实现方式,既保证了线程安全,又避免了同步带来的性能影响。例如:
```java
public enum SingletonEnum {
INSTANCE;
public void singletonMethod() {
//...
}
}
```
四、ThreadLocal式单例
ThreadLocal主要用于解决多线程环境下每个线程拥有独立实例的需求。它为每个线程创建单独的副本,但不适用于所有场景,因为可能会导致内存泄漏。例如:
```java
public class ThreadLocalSingleton {
private static ThreadLocal<ThreadLocalSingleton> threadLocal = new ThreadLocal<>();
private ThreadLocalSingleton() {}
public static ThreadLocalSingleton getInstance() {
ThreadLocalSingleton instance = threadLocal.get();
if (instance == null) {
instance = new ThreadLocalSingleton();
threadLocal.set(instance);
}
return instance;
}
}
```
每种单例模式都有其适用的场景,开发者应根据实际需求选择最合适的实现方式。例如,如果对性能要求较高且资源消耗不大,饿汉式可能是好选择;如果希望在首次访问时才创建实例,懒汉式(尤其是DCL)更合适;而在大型应用中,通过容器管理的注册式单例或枚举单例可以提供更好的灵活性和安全性。
2012-03-16 上传
2018-05-15 上传
2019-07-13 上传
2012-06-23 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38586118
- 粉丝: 6
- 资源: 922
最新资源
- StarModAPI: StarMade 模组开发的Java API工具包
- PHP疫情上报管理系统开发与数据库实现详解
- 中秋节特献:明月祝福Flash动画素材
- Java GUI界面RPi-kee_Pilot:RPi-kee专用控制工具
- 电脑端APK信息提取工具APK Messenger功能介绍
- 探索矩阵连乘算法在C++中的应用
- Airflow教程:入门到工作流程创建
- MIP在Matlab中实现黑白图像处理的开源解决方案
- 图像切割感知分组框架:Matlab中的PG-framework实现
- 计算机科学中的经典算法与应用场景解析
- MiniZinc 编译器:高效解决离散优化问题
- MATLAB工具用于测量静态接触角的开源代码解析
- Python网络服务器项目合作指南
- 使用Matlab实现基础水族馆鱼类跟踪的代码解析
- vagga:基于Rust的用户空间容器化开发工具
- PPAP: 多语言支持的PHP邮政地址解析器项目