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

Java 单例模式实现方式

Java 单例模式实现方式

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

1. 饿汉式(Eager Initialization)

public class EagerSingleton {// 类加载时就初始化private static final EagerSingleton INSTANCE = new EagerSingleton();// 私有构造函数private EagerSingleton() {}public static EagerSingleton getInstance() {return INSTANCE;}
}

特点

  • 线程安全(由JVM类加载机制保证)
  • 简单直接
  • 可能造成资源浪费(即使不用也会创建实例)

2. 懒汉式(Lazy Initialization,非线程安全)

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

问题

  • 非线程安全,多线程环境下可能创建多个实例

3. 懒汉式(同步方法,线程安全但效率低)

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

特点

  • 线程安全
  • 每次获取实例都需要同步,性能较差

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

public class DCLSingleton {// 使用volatile禁止指令重排序private static volatile DCLSingleton instance;private DCLSingleton() {}public static DCLSingleton getInstance() {if (instance == null) { // 第一次检查synchronized (DCLSingleton.class) {if (instance == null) { // 第二次检查instance = new DCLSingleton();}}}return instance;}
}

特点

  • 线程安全
  • 只有第一次创建时需要同步
  • Java 5+ 需要配合 volatile 使用

5. 静态内部类(Holder模式,推荐)

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

优点

  • 线程安全(由JVM类加载机制保证)
  • 懒加载(只有调用getInstance()时才加载内部类)
  • 无同步开销
  • 目前最推荐的方式

6. 枚举实现(Effective Java推荐)

public enum EnumSingleton {INSTANCE;public void doSomething() {// 业务方法}
}

优点

  • 线程安全
  • 防止反射攻击
  • 防止反序列化重新创建对象
  • 代码简洁
  • Joshua Bloch在《Effective Java》中推荐的方式

如何选择

  1. 简单场景:饿汉式或枚举方式
  2. 需要懒加载:静态内部类方式
  3. 非常注重性能:双重检查锁定(但要注意正确实现)
  4. 最佳实践推荐:枚举方式或静态内部类方式

注意事项

  1. 防止反射攻击:可以在构造函数中添加检查
  2. 防止反序列化:实现readResolve()方法
  3. 在分布式/集群环境中,这些单例实现仅适用于单个JVM
http://www.xdnf.cn/news/1037665.html

相关文章:

  • 偶数项收敛半径
  • 地理数据库 gdb mdb sde 名称的由来
  • uni-app项目实战笔记10--设置页面全局渐变线性渐变背景色
  • 深入解析ArrayList源码:从短链项目实战到底层原理
  • windterm no match for method encryption client
  • 盟接之桥EDI软件安全机制及工作原理详解
  • uni-app项目实战笔记11--定义scss颜色变量方便页面引用
  • 论文略读: CITYANCHOR: CITY-SCALE 3D VISUAL GROUNDING WITH MULTI-MODALITY LLMS
  • 容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油。程序输出分油次数最少的详细操作过程。
  • 【leetcode】78. 子集
  • 2.2 状态空间表达式的解
  • 初探Qt信号与槽机制
  • 21 - GAM模块
  • 破壁虚实的情感科技革命:元晟定义AI陪伴机器人个性化新纪元
  • SpringBoot 自动化部署实战:从环境搭建到 CI/CD 全流程
  • vulnyx Diff3r3ntS3c writeup
  • CLONE:用于长距离任务的闭环全身人形机器人遥操作
  • C++之模板进阶
  • 多线程下 到底是事务内部开启锁 还是先加锁再开启事务?
  • 《人工智能时代与人类价值》读书简要笔记
  • [CVPR 2025] DeformCL:基于可变形中心线的3D血管提取新范式
  • Docker全平台安装指南:从零到一构建容器化环境(满级版)
  • GDI+ 中与GDI32取图形区域函数对比CreateEllipticRgn/CreatePolygonRgn
  • g++ a.cpp -o a ‘pkg-config --cflags --libs opencv4‘/usr/bin/ld: 找不到 没有那个文件或目录
  • [智能客服project] AI提示词配置 | 主协调器 | 闲鱼协议工具
  • PX4无人机|MID360使用FAST_LIO,实现自主定位及定点——PX4无人机配置流程(五)
  • Vue Methods 实现原理详解
  • 【数据集成与ETL 04】dbt实战指南:现代化数据转换与SQL代码管理最佳实践
  • 一个前端正则校验引发的问题
  • 马上行计划管理后端架构