当前位置: 首页 > news >正文

单例模式的五种实现方式及优缺点

单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点来访问该实例。在Java中,单例模式的实现有多种方式,每种方式都有其优缺点和适用场景。以下是一些常见的单例模式实现方式及其代码示例:

1. 饿汉式(Eager Singleton)

饿汉式在类加载时就创建实例,线程安全,但可能会浪费资源。

public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();

private EagerSingleton() {}public static EagerSingleton getInstance() {return instance;
}

}

2. 懒汉式(Lazy Singleton)

懒汉式在第一次调用时创建实例,线程不安全,需要加锁以保证线程安全。

public class LazySingleton {
private static LazySingleton instance;

private LazySingleton() {}public static synchronized LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;
}

}

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

双重检查锁在懒汉式的基础上进行了优化,减少了锁的开销,但仍然存在线程安全问题。

public class DoubleCheckedLockingSingleton {
private static volatile DoubleCheckedLockingSingleton instance;

private DoubleCheckedLockingSingleton() {}public static DoubleCheckedLockingSingleton getInstance() {if (instance == null) {synchronized (DoubleCheckedLockingSingleton.class) {if (instance == null) {instance = new DoubleCheckedLockingSingleton();}}}return instance;
}

}

4. 静态内部类(Static Inner Class)

静态内部类利用了Java的类加载机制,实现了延迟加载和线程安全。

public class StaticInnerClassSingleton {
private StaticInnerClassSingleton() {}

private static class SingletonHolder {private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
}public static StaticInnerClassSingleton getInstance() {return SingletonHolder.INSTANCE;
}

}

5. 枚举(Enum)

枚举是实现单例模式的最佳方式,简洁且线程安全。

public enum EnumSingleton {
INSTANCE;

public void someMethod() {// 方法实现
}

}

总结

• 饿汉式:简单直接,但可能浪费资源。
• 懒汉式:延迟加载,但需要加锁,可能导致性能问题。
• 双重检查锁:优化了懒汉式,减少了锁的开销,但仍需注意线程安全问题。
• 静态内部类:延迟加载且线程安全,推荐使用。
• 枚举:简洁且线程安全,推荐在Java中使用。
每种实现方式都有其适用的场景和优缺点,选择合适的单例模式实现方式可以提高代码的性能和可维护性。


http://www.mrgr.cn/news/63948.html

相关文章:

  • Docker 镜像体积优化实践:从基础镜像重建到层压缩的全流程指南
  • 【玩转 Postman 接口测试与开发2_003】第一章:API 相关术语及类型
  • (9)位运算
  • 曾黎:双十一商业女顶流,以实力代言诠释商务新高度
  • 记一次线上服务频繁崩溃问题排查
  • day 5
  • 从0开始学统计-什么是Z-score
  • 【国产MCU系列】-GD32F4开发环境搭建(基于Embedded Builder)
  • 自动化测试工具Ranorex Studio(十九)-其他编辑选项
  • HTML 基础标签——分组标签 <div>、<span> 和基础语义容器
  • magic-api简单使用六:删除接口(支持路径传参)
  • 从实验室到生活:超分子水凝胶湿电发电机的应用之路
  • 【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割!
  • 学生党百元预算如何选到高性价比头戴耳机?四款百元热门耳机推荐
  • 国密SM2 非对称加解密前后端工具
  • 在 openEuler 22.03 服务器上搭建 web 服务教程
  • 100种算法【Python版】第34篇——PageRank算法
  • 构建高效信息学科平台:Spring Boot实践
  • 小区搜索和SSB简介
  • 华为机试HJ17 坐标移动
  • 基于java+SpringBoot+Vue的美容院管理系统设计与实现
  • 【华为HCIP实战课程三十】中间到中间系统协议IS-IS路由渗透及TAG标识详解,网络工程师
  • 【第几小】
  • 华为 HCIP-Datacom H12-821 题库 (40)
  • (undone) MIT6.S081 2023 一个月速通 (Day1: 了解 xv6 结构) (TODO: fs.img 生成方式不清楚)
  • ‌5G SSB(同步信号块)位于物理层‌