
Java设计模式详解:单例模式(Singleton)的应用与实现
81KB |
更新于2024-09-01
| 11 浏览量 | 举报
收藏
"Java设计模式单例模式(Singleton)用法解析"
Java设计模式中的单例模式(Singleton Pattern)是一种创建型设计模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这个唯一实例可以在整个应用程序中被多个组件共享,从而减少资源消耗,提高性能。单例模式的应用场景广泛,例如在Java Web开发中,ServletContext、ServletConfig以及Spring框架中的ApplicationContext和SessionFactory等都是单例模式的典型应用。
单例模式的核心在于限制类的实例化过程,通常通过以下几种方式实现:
1. 懒汉式(线程不安全):这是最简单的单例实现方式,也称为延迟初始化。在类被加载时并不立即创建实例,而是在首次调用`getInstance()`方法时才创建。如下所示:
```java
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
```
这里的代码是线程安全的,因为使用了`synchronized`关键字,但同步操作降低了性能,只有在多线程环境下才会生效。不推荐在单线程环境中使用这种实现方式。
2. 双重检查锁定(DCL,Double-Check Locking):这种方式既实现了延迟初始化,又解决了线程安全问题,提高了性能。
```java
public class DoubleCheckLockingSingleton {
private volatile static DoubleCheckLockingSingleton instance;
private DoubleCheckLockingSingleton() {}
public static DoubleCheckLockingSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckLockingSingleton.class) {
if (instance == null) {
instance = new DoubleCheckLockingSingleton();
}
}
}
return instance;
}
}
```
这里的关键在于`volatile`关键字,它确保了多个线程间的可见性和禁止指令重排序,从而保证了单例的正确性。
3. 静态内部类:这种方式利用了类加载机制来保证单例,无需同步,也能实现延迟初始化。
```java
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
```
类`SingletonHolder`只在首次调用`getInstance()`时加载,因此实例化过程也是延迟的。
4. 枚举:这是最简洁且安全的单例实现方式,由JDK 5.0引入。
```java
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
```
枚举天生就是线程安全的,无需担心多线程问题,而且不能被反射攻击。
需要注意的是,虽然单例模式在很多情况下都非常有用,但过度使用可能会导致设计过于复杂,使得系统难以测试和维护。因此,在设计时应根据实际情况谨慎选择是否使用单例模式。在Java中,如果单例对象需要跨JVM共享,还可以考虑使用`java.lang.ApplicationContext`或`java.lang.Cache`等工具。
相关推荐




















weixin_38645379
- 粉丝: 7
最新资源
- 2020秋季学期Web客户端课程:远程学习与实践指导
- React Next.js挑战:深入了解FRIENDS系列
- BSwarm:简化Bhyve虚拟机管理的脚本工具
- 探索Web API提案:增强网站间数据共享功能
- 探索hxDaedalus-Examples: Haxe的Daedalus-lib示例存储库
- Objective-C Instagram SDK框架使用及许可说明
- 基于数字图像处理技术的MATLAB芯片检测方法
- 球形生成对抗网络SGAN的Matlab素描代码实现
- Matlab实现分形图像压缩技术与相关库功能介绍
- 小米智能设备新语言包MiBandageLang发布
- Next.js入门指南与实践:服务器渲染与路由映射
- 检测Google Maps API密钥安全性的Python扫描器
- Android元素周期表应用Elementary:参考与视频教学
- Cerbero:Rust实现的Kerberos协议攻击工具介绍
- 打造个性化自定义键盘:软件键盘的革新体验
- GitHub存储库入门工具包:Nexmo的开源标准和最佳实践
- 网页UI设计实践:从灵感到编码的全过程
- Beer Quiz应用:React与Next.js的实践学习项目
- 解析安全公告库:advisory-parser的功能与应用
- 面向初学者的quranweb前端开发教程
- Ansible.Role Prometheus监控解决方案:自动化部署与配置
- Laravel框架学习与实践:从入门到精通
- CI-BuildStats: SVG小工具展示持续集成构建历史
- 流式决策树C++库:华为streamDM-Cpp深度解析