Java中的单例模式实现方式比较

在Java中,单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。以下是几种常见的单例模式实现方式:

  1. 饿汉式单例模式

    • 在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快。
    • 在类加载时就完成了初始化,如果线程安全环境下,可能会引发线程安全问题。
复制代码

java复制代码

|---|---------------------------------------------------------|
| | public class Singleton { |
| | // 在类加载时就完成了初始化,所以类加载比较慢 |
| | private static Singleton instance = new Singleton(); |
| | |
| | private Singleton() {} |
| | |
| | public static Singleton getInstance() { |
| | return instance; |
| | } |
| | } |

  1. 懒汉式单例模式

    • 类加载时不初始化,当调用 getInstance() 方法时才初始化。如果线程安全环境下,可能会引发线程安全问题。
复制代码

java复制代码

|---|---------------------------------------------------------|
| | public class Singleton { |
| | private static Singleton instance; |
| | |
| | private Singleton() {} |
| | |
| | public static synchronized Singleton getInstance() { |
| | if (instance == null) { |
| | instance = new Singleton(); |
| | } |
| | return instance; |
| | } |
| | } |

  1. 双重检查锁定(Double-Checked Locking)

    • 第一次检查是为了避免不必要的同步,第二次检查是为了防止多线程情况下创建多个实例。在Java 5及以上版本中,此方法可以安全地实现单例模式。
复制代码

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; |
| | } |
| | } |

  1. 静态内部类(静态嵌套类)

这是线程安全的懒汉式单例模式。由于JVM对类的加载是线程安全的,因此在类加载时不会发生线程安全问题。静态内部类在类加载时只会加载一次,所以只有在第一次调用 getInstance() 时才会创建实例。由于JVM对类的加载是线程安全的,因此这种实现方式也是线程安全的。

复制代码

java复制代码

|---|---------------------------------------------------------------|
| | public class Singleton { |
| | private Singleton() {} |
| | private static class Holder { |
| | private static final Singleton INSTANCE = new Singleton(); |
| | } |
| | public static Singleton getInstance() { |
| | return Holder.INSTANCE; |
| | } |
| | } |

相关推荐
灵犀坠6 分钟前
前端面试八股复习心得
开发语言·前端·javascript
代码游侠22 分钟前
学习笔记——数据结构学习
linux·开发语言·数据结构·笔记·学习
vvoennvv24 分钟前
【Python TensorFlow】 TCN-GRU时间序列卷积门控循环神经网络时序预测算法(附代码)
python·rnn·神经网络·机器学习·gru·tensorflow·tcn
沐知全栈开发30 分钟前
XML 验证器
开发语言
YJlio34 分钟前
[编程达人挑战赛] 用 PowerShell 写了一个“电脑一键初始化脚本”:从混乱到可复制的开发环境
数据库·人工智能·电脑
x***133936 分钟前
MySQL 篇 - Java 连接 MySQL 数据库并实现数据交互
java·数据库·mysql
摇滚侠37 分钟前
零基础小白自学 Git_Github 教程,发现工具寻找灵感,笔记04
笔记·github
xuanzdhc40 分钟前
Gitgit
java·linux·运维·服务器·c++·git
玦尘、1 小时前
《统计学习方法》第4章——朴素贝叶斯法【学习笔记】
笔记·机器学习
RoboWizard1 小时前
PCIe 5.0 SSD有无独立缓存对性能影响大吗?Kingston FURY Renegade G5!
人工智能·缓存·电脑·金士顿