Java单例模式深度解析:四种实现方式
4星 · 超过85%的资源 需积分: 9 179 浏览量
更新于2024-09-18
收藏 2KB TXT 举报
"本文主要介绍了单例模式的概念和四种实现方式,包括饿汉式、懒汉式、双重检查锁定和静态内部类的方式。"
单例模式是一种常用的软件设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于管理共享资源,如数据库连接池、线程池或配置对象等,以提高系统效率并减少不必要的资源消耗。
1. 饿汉式(静态常量):
这是最简单的单例实现,类加载时就完成了实例化,确保了线程安全。代码中的`S1`就是饿汉式的例子。这种方式在类加载时就创建了单例对象,虽然实现了线程安全,但可能会浪费内存,因为即使没有使用,单例也会被创建。
```java
class S1 {
private S1() {
System.out.println("ok1");
}
private static final S1 instance = new S1();
public static S1 getInstance() {
return instance;
}
}
```
2. 懒汉式(线程不安全):
在懒汉式中,单例对象在第一次调用`getInstance()`方法时才创建。这种方式延迟了实例化,但当多个线程同时调用`getInstance()`时,可能会创建多个实例,不符合单例的要求。代码中的`S2`是懒汉式的例子,它未考虑线程安全性。
```java
class S2 {
private S2() {
System.out.println("ok2");
}
private static S2 instance = null;
public static synchronized S2 getInstance() {
if (instance == null) {
instance = new S2();
}
return instance;
}
}
```
3. 双重检查锁定(DCL,线程安全):
为了弥补懒汉式的线程安全问题,引入了双重检查锁定。首先检查实例是否已经创建,如果未创建,再进行同步创建。这样既延迟了实例化,又保证了线程安全。代码中的`S3`是DCL的例子。
```java
class S3 {
private S3() {
System.out.println("ok3");
}
private static S3 instance = null;
public static S3 getInstance() {
if (instance == null) {
synchronized (S3.class) {
if (instance == null) {
instance = new S3();
}
}
}
return instance;
}
}
```
4. 静态内部类(线程安全):
利用Java类加载机制保证了线程安全,同时也延迟了实例化。代码中的`S4`使用了静态内部类的方式实现单例。
```java
class S4 {
private S4() {
System.out.println("ok4");
}
private static class S4Holder {
static S4 instance = new S4();
}
public static S4 getInstance() {
return S4Holder.instance;
}
}
```
总结来说,单例模式在Java中有多种实现方式,每种方式都有其特点和适用场景。饿汉式适用于对性能要求较高且单例在程序生命周期内一直存在的场景;懒汉式适合对资源初始化有延迟需求的情况,但需要保证线程安全;双重检查锁定在延迟初始化和线程安全之间找到了平衡;静态内部类的方式则是兼顾了延迟初始化和线程安全,同时避免了同步开销,是推荐的实现方式。
2021-01-19 上传
2021-01-20 上传
2020-11-21 上传
2018-02-03 上传
2020-10-18 上传
2020-10-26 上传
zuguohao
- 粉丝: 0
- 资源: 1
最新资源
- 高清艺术文字图标资源,PNG和ICO格式免费下载
- mui框架HTML5应用界面组件使用示例教程
- Vue.js开发利器:chrome-vue-devtools插件解析
- 掌握ElectronBrowserJS:打造跨平台电子应用
- 前端导师教程:构建与部署社交证明页面
- Java多线程与线程安全在断点续传中的实现
- 免Root一键卸载安卓预装应用教程
- 易语言实现高级表格滚动条完美控制技巧
- 超声波测距尺的源码实现
- 数据可视化与交互:构建易用的数据界面
- 实现Discourse外聘回复自动标记的简易插件
- 链表的头插法与尾插法实现及长度计算
- Playwright与Typescript及Mocha集成:自动化UI测试实践指南
- 128x128像素线性工具图标下载集合
- 易语言安装包程序增强版:智能导入与重复库过滤
- 利用AJAX与Spotify API在Google地图中探索世界音乐排行榜