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

相关推荐
aneasystone本尊8 分钟前
让小龙虾自己写手册:Skill Workshop
人工智能
火山引擎开发者社区43 分钟前
一篇看懂 VKE AI Profiling:AI 应用性能分析优化实战
人工智能
IT乐手1 小时前
马斯克的AI模型Grok,竟然帮美军炸了伊朗?!
人工智能
AI袋鼠帝1 小时前
斥资500元/上亿Token,深度横评4个顶尖模型的真实排名~
人工智能
大刚测试开发实战10 小时前
TestHub V0.2.2版本发布,附更新指南
人工智能
冬奇Lab11 小时前
Agent 系列(21):Harness 测试工程——45 个测试怎么设计,以及它发现了什么 bug
人工智能·llm·agent
冬奇Lab12 小时前
每日一个开源项目(第133篇):EchoBird - 把 AI 工具的安装和部署做成傻瓜操作
人工智能·开源·资讯
程序员龙叔12 小时前
编写高质量 Skill 系列 -- 如何设计需求分析与用例生成的 SKILL
自动化测试·软件测试·python·软件测试工程师·接口测试·性能测试·skill·ai测试
IT_陈寒13 小时前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
NE_STOP15 小时前
Vide Coding--AI编程工具的选择
java