Java单例模式全面解析:饿汉式、懒汉式、注册式与ThreadLocal
版权申诉
106 浏览量
更新于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)更合适;而在大型应用中,通过容器管理的注册式单例或枚举单例可以提供更好的灵活性和安全性。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2018-05-15 上传
2019-07-13 上传
2012-06-23 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38586118
- 粉丝: 6
- 资源: 922
最新资源
- 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算法及互相关性能优化指南