Java单例模式解析:饿汉、懒汉与登记式
需积分: 16 157 浏览量
更新于2024-09-11
收藏 25KB DOCX 举报
"Java设计模式-单例模式详解,包括饿汉、懒汉、登记式三种实现方式,以及线程安全的处理"
单例模式是软件设计中的一种常见模式,其核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于创建那些需要频繁使用的对象,如配置管理、日志记录、缓存服务等,以减少系统资源的消耗,提高性能。
1. 饿汉式单例
饿汉式单例在类加载时即完成了实例化,确保了类加载完成后只有一个实例存在。它通过`final`修饰的静态成员变量来存储单例实例,确保了线程安全。这种方式的优点是简单且线程安全,缺点是在类加载时就初始化,即使从未使用过单例,也会占用一定的内存资源。
```java
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
```
2. 懒汉式单例
懒汉式单例在首次使用时才实例化,这样可以避免无谓的资源消耗。但非线程安全,当多个线程同时调用`getInstance()`时,可能会创建多个实例。为了使其线程安全,通常会使用`synchronized`关键字对`getInstance()`方法进行同步,但这会降低效率。
```java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
3. 登记式(也称为静态内部类)单例
登记式单例结合了饿汉式和懒汉式的优点,既延迟加载,又保证线程安全。它利用Java类加载机制来保证初始化实例时只有一个线程。
```java
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
```
在多线程环境下,上述三种实现方式的线程安全性需特别注意。对于懒汉式,如果没有采用同步机制,可能导致多个线程各自创建单例实例。而饿汉式和登记式由于在类加载时完成实例化或初始化,因此天然线程安全。
单例模式的使用应谨慎,过度依赖单例可能导致难以测试和维护的代码。在Java中,`enum`也是实现单例的一个有效且推荐的方式,因为它既保证了线程安全,又避免了双重检查锁定等问题。
单例模式的应用广泛,但设计时需考虑其生命周期、线程安全以及可能带来的副作用,合理选择和实现单例模式。
2011-03-01 上传
2010-03-12 上传
2022-11-24 上传
2023-05-31 上传
2023-05-11 上传
2023-09-07 上传
2023-08-31 上传
2024-10-27 上传
2024-10-27 上传
猫大叔
- 粉丝: 217
- 资源: 151
最新资源
- 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算法及互相关性能优化指南