Java单例模式解析:饿汉、懒汉与登记式
需积分: 16 153 浏览量
更新于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`也是实现单例的一个有效且推荐的方式,因为它既保证了线程安全,又避免了双重检查锁定等问题。
单例模式的应用广泛,但设计时需考虑其生命周期、线程安全以及可能带来的副作用,合理选择和实现单例模式。
234 浏览量
372 浏览量
122 浏览量
152 浏览量
319 浏览量
155 浏览量
137 浏览量
148 浏览量
猫大叔
- 粉丝: 217
最新资源
- finquick:利用Web应用实现gnucash财务数据实时访问与同步
- 探索网络化技术的未来发展与应用
- Wireshark网络数据包分析与处理技巧全解
- GitHub文件编辑监控:通过Webhook及时获取通知
- 安卓图像处理:实现头像圆角剪裁与照片获取教程
- 点菜管理系统课程设计:数据库应用与程序开发
- MediBang Paint Pro v5.3 32位版本:专业漫画绘制与云同步
- 2019年数学建模竞赛题及翻译分享
- 合同内其它业务收入管理规定全面解析
- AITalker: 探索人工智能聊天助手的开源世界
- Minecraft Spigot插件配置:fkboard动态Web界面
- NumberDrive项目中的表达式解析器NumberDriveParser
- Biu-link:NodeJS实现的文本文件URL缩短器
- 探索Texas LED字体的设计与应用
- QuizizzHelper:简化在线Quizizz操作的JavaScript工具
- 安卓平台头像制作与圆角剪裁功能实现教程