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

Java 单例模式详解

单例模式(Singleton Pattern)是一种常见的设计模式,它可以确保某个类只有一个实例,并提供对该实例的全局访问点。本文将详细介绍 Java 中所有单例模式实现,包括懒汉式、饿汉式、枚举式、双重检查锁定式、静态内部类式等。

1. 懒汉式

1.1 线程不安全

懒汉式指的是在需要获取单例实例时才进行初始化。其特点是在第一次调用 getInstance() 方法时才创建单例对象,避免了预先占用系统资源。

懒汉式有两种常见的实现方式。第一种是线程不安全的实现方式,代码如下所示:

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

这种实现方式线程不安全,多线程情况下可能会创建多个实例,因此需要进行线程安全处理。

1.2 线程安全

第二种实现方式是在 getInstance() 方法上添加 synchronized 关键字来保证线程安全,代码如下所示:

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

这种实现方式使用 synchronized 关键字来保证线程安全,在多线程情况下只会创建一个实例,但加锁会降低性能。

2. 饿汉式

饿汉式指的是在类加载时就进行初始化,无论是否需要该实例。其特点是在程序启动时就创建单例对象,可以确保线程安全,但可能会占用较多的系统资源。

饿汉式的代码实现如下:

public class Singleton {private static Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}

3. 枚举式

枚举式是 Java 中最简洁、最安全的单例实现方式。它通过枚举类型来实现单例,可以避免线程安全问题和反射攻击等问题。

枚举式的代码实现如下:

public enum Singleton {INSTANCE;public void doSomething() {// ...}
}

在枚举式中,INSTANCE 是一个枚举常量,它表示单例实例。通过枚举类型的特性,保证在任何情况下都只会创建一个实例。

4. 双重检查锁定式

双重检查锁定式是一种常用的懒汉式单例实现方式,它通过双重判断来保证线程安全和性能。

双重检查锁定式的代码实现如下:

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

在双重检查锁定式中,第一次判断 instance 是否为 null 是为了避免不必要的同步,第二次判断是为了保证线程安全。使用 volatile 关键字可以确保多线程环境下的可见性。

5. 静态内部类式

静态内部类式是一种常用的懒汉式单例实现方式,它通过静态内部类来实现延迟加载和线程安全。

静态内部类式的代码实现如下:

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

在静态内部类式中,静态内部类 SingletonHolder 会在第一次使用时被加载,而 Singleton 类则是在调用 getInstance() 方法时才被加载,从而实现了延迟加载。由于静态内部类只会被加载一次,因此该实现方式也可以保证线程安全。

总结

本文介绍了 Java 中所有常见的单例模式实现方式,包括懒汉式、饿汉式、枚举式、双重检查锁定式和静态内部类式。每种实现方式都有其优缺点和适用场景,大家需要根据实际情况进行选择。无论选择哪种实现方式,都应该遵循单一责任原则和开闭原则等设计原则,以确保代码具有良好的可维护性和扩展性。

http://www.lryc.cn/news/66583.html

相关文章:

  • AI读心重磅突破登Nature!大脑信号1秒被看穿,还能预测未来画面
  • 【SAP Abap】X-DOC:SNRO - ABAP流水号应用
  • 基于AT89C51单片机的交通灯设计与仿真
  • MySQL系列三(定位慢SQL、SQL优化与索引优化)Using filesort
  • 免费使用GPT-4.0?【AI聊天 | GPT4教学】 —— 微软 New Bing GPT4 申请与使用保姆级教程
  • 渲染对电脑伤害大吗_如何减少渲染伤机?
  • 非线性最小二乘
  • 23.5.7总结(学习通项目思路)
  • 如何生成api接口获取宝贝商品详情,商品详情接口,产品详情
  • 微服务---Redis实用篇-黑马头条项目-登录功能(短信验证缓存,用户信息缓存)
  • 美国纽扣电池的包装电池盒必须附带警告标签16 CFR 第 1700.20
  • AcWing——方格迷宫(有点不一样的迷宫问题)
  • 《常规脉搏传输时间作为人体血压变化标志》阅读笔记
  • java学习之异常三
  • 生产者向 Kafka 发送消息的执行流程
  • Linux命令·netstat
  • 《心安即是归处》读书笔记
  • C++:使用红黑树封装map和set
  • Go 命令
  • LEO、HW、LSO、LW 分别代表什么?
  • 问题 B: 跳石头(C++)(二分答案)
  • bugku——变量1
  • 网络数据包丢失监控
  • Linux服务器安装部署MongoDB数据库 - 无公网IP远程连接
  • CSS面试题:30道含答案和代码示例的练习题
  • 时间轮的golang实践浅析
  • Linux命令_stress 快速模拟CPU、内存、磁盘消耗
  • 可视化绘图技巧100篇分析篇(二)-生存曲线(LM曲线)
  • UP主发车啦!撩人仙侠文系列,谁来管管这个反派啊!
  • K8S使用持久化卷存储到NFS(NAS盘)