Java实现单例模式:详解与代码示例
需积分: 1 98 浏览量
更新于2024-08-03
收藏 26KB DOCX 举报
唯一实例声明为私有静态变量,并在首次调用getInstance()方法时进行实例化。这种方式确保了只有在需要时才会创建单例对象,从而解决了饿汉式的资源浪费问题。
实现代码:
```java
public class Singleton {
private static Singleton instance;
private Singleton() {
// 私有化构造函数
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
在懒汉式中,我们使用了`synchronized`关键字来确保线程安全。这意味着当多个线程尝试同时访问`getInstance()`方法时,只有一个线程能够执行,其余线程将等待直到该方法执行完成。这确保了在多线程环境中,单例对象只会被创建一次。然而,懒汉式也存在以下问题:
1. 性能开销:由于每次调用`getInstance()`都需要进行同步,这在高并发场景下可能会成为性能瓶颈。
2. 只是基本的线程安全:虽然懒汉式在多线程环境下的实现是线程安全的,但还存在一种称为“双重检查锁定”(Double-Checked Locking)的优化方案,可以进一步减少同步的开销。
双重检查锁定(DCL)
DCL通过引入volatile关键字来解决懒汉式中的性能问题,确保在多个线程之间正确地读取和更新实例变量。
实现代码:
```java
public class Singleton {
private volatile static Singleton instance;
private Singleton() {
// 私有化构造函数
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
```
在DCL中,只有当instance为null时,才会进入同步代码块。这样,大部分情况下无需同步也能正常工作,只有在真正创建单例时才需要同步,从而降低了性能影响。
总结来说,单例模式是软件设计中常用的一种模式,用于控制类的实例化过程,确保在整个应用程序中只有一个实例存在。通过饿汉式、懒汉式和双重检查锁定等实现方式,我们可以根据具体需求选择合适的方法来创建和管理单例。然而,单例模式也有其局限性,比如不易于测试、违反了开闭原则等,因此在实际开发中需要谨慎使用。在Java中,我们还可以利用枚举类型实现单例,这是一种更安全、简洁且线程安全的方式,也是推荐的实现方法。
2017-11-30 上传
2018-07-17 上传
2009-07-15 上传
2024-06-30 上传
2023-11-10 上传
2023-05-24 上传
2023-03-28 上传
2023-03-07 上传
2023-11-21 上传
大宝贱
- 粉丝: 469
- 资源: 498
最新资源
- 愤怒的小鸟
- Python库 | python-datamatrix-0.7.1.tar.gz
- 毕业设计&课设--大学 毕业设计之Android项目,记事本。.zip
- netlify-lambda-builder:在制品实验
- SpaceStation12
- cFS-GroundSystem:核心飞行系统(cFS)地面系统实验室工具(cFS-GroundSystem)
- Pester-LogicApp:此示例显示了如何使用Pester和PowerShell集成测试Logic App
- HTML5-Speak-Easy:Web Speech API 语音合成(文本到语音)包装器
- resisc45_256_256_3.zip
- 毕业设计&课设--短视频社交软件 ,微信小程序,后台管理系统,专科毕业设计,仿抖音,springcloud+spri.zip
- Excel模板年级成绩自动统计.zip
- yash0patni:我的GitHub个人资料的配置文件
- travis-heroku-example:具有create-react-app,travis,heroku,Jest和Cucumber的持续交付示例
- ROSS:伦斯勒的乐观仿真系统
- 换肤器-独立-
- synaptic-lab:在 Clojure 中可视化和试验神经网络