Java单例模式详解:饿汉式、懒汉式与双重检查锁定
需积分: 6 60 浏览量
更新于2024-09-10
收藏 9KB TXT 举报
"本文介绍了Java中的单例模式,包括三种常见的实现方式:饿汉式、懒汉式和双重检查锁定(DCL)式,并分析了各自的优缺点。"
在软件设计模式中,单例模式是一种常用的创建型模式,它保证一个类只有一个实例,并提供一个全局访问点。在Java中,实现单例模式有多种方法,这里主要讨论三种常见的策略。
1. 饿汉式(静态常量初始化)
这是最简单的单例实现方式,它在类加载时就完成了初始化,因此线程安全。代码如下:
```java
public class Singleton {
private static final Singleton single = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return single;
}
}
```
饿汉式的优势在于实现简单,且由于在类加载时就完成了实例化,所以不存在多线程同步问题,性能较好。但缺点是如果单例对象不被使用,内存可能会被浪费。
2. 懒汉式(线程不安全)
懒汉式在类加载时不初始化单例,而是在第一次调用`getInstance()`时才进行实例化。但这种方式在多线程环境下可能产生多个实例,如下:
```java
public class Singleton {
private static Singleton single = null;
private Singleton() {}
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
```
为了解决线程安全问题,通常需要对`getInstance()`方法进行同步,但这将导致性能下降。
3. 双重检查锁定(DCL)式
DCL结合了饿汉式和懒汉式的优点,确保了线程安全且延迟初始化。关键在于两次检查`single`是否为`null`,并在实例化前进行同步,如下:
```java
public class Singleton {
private volatile static Singleton singleton = null;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
```
DCL方式通过`volatile`关键字确保了多线程环境下的可见性和有序性,从而避免了线程安全问题,同时延迟了初始化,提高了性能。但需要注意的是,这里的`volatile`关键字非常重要,它保证了多线程环境下`singleton`变量的正确初始化。
此外,还有枚举单例、静态内部类单例等方式,它们同样能够保证单例的唯一性,并且具有良好的线程安全性。枚举单例是最推荐的方式,因为它简洁且自动处理了线程安全问题,如下:
```java
public enum Singleton {
INSTANCE;
}
```
总结来说,选择哪种单例模式取决于实际需求,如性能、线程安全、内存占用等因素。在Java中,通常推荐使用双重检查锁定或枚举单例方式来实现单例模式。
2023-01-21 上传
2018-07-17 上传
2020-12-22 上传
2010-06-21 上传
2012-10-28 上传
2020-08-18 上传
2010-12-28 上传
2023-05-27 上传
2023-07-13 上传
zb0002011
- 粉丝: 10
- 资源: 1
最新资源
- ayotidur
- Exsty-crx插件
- Language-zone
- SCATTERBAR3:创建一个 3-D 条形图,其中条形放置在用户指定的 XY 位置。-matlab开发
- TensorFlow2实战-系列教程14:Resnet实战
- [新闻文章]小虫新闻管理系统V1.0_xcnewsv1.0.rar
- AzureDiagnosticsPipeline:此存储库具有构建Azure诊断DevOps管道的源,以将诊断设置应用于Azure资源(动态)
- 蛇:基于控制台的蛇游戏
- TurboCStudy,c语言编译的源码,c语言项目
- Biorhythm:你的一周过得怎么样?-matlab开发
- koa-template-project:Koa模板项目
- 简洁棕色线条响应式html5模板5598.zip
- Coin Master Free Spins Loader-crx插件
- 苹果手机
- click-and-meet-calendar-generator:生成可打印的日历,以根据德国的COVID-19规则管理“点击并开会”约会
- -123r