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

线程安全的单例模式

  1. 使用 synchronized 修饰 getInstance 方法

确保了只有一个线程可以同时访问 getInstance 方法。这意味着在任何时候只有一个线程可以执行 getInstance() 方法,从而避免了多个线程同时创建多个实例的情况,因此是线程安全的。

public class ClientUtil {private static ClientUtil clientUtil;private ClientUtil() {}public static synchronized ClientUtil getInstance() {if (null == clientUtil) {clientUtil = new ClientUtil();clientMap = new HashMap<String, ApiClient>();}return clientUtil;}
}

但是,这种实现方式会在每次调用 getInstance() 方法时都获取锁,这可能会影响性能,尤其是在高并发的情况下。因为只有一个线程可以访问该方法,其他线程必须等待当前线程释放锁才能继续执行。

  1. 使用双重检查锁定(Double-Checked Locking)机制 优化性能

核心思想是在首次检查对象是否为 null 时进行同步,以确保只有一个线程可以创建对象,而后续的检查则不需要同步,以提高性能。

public class ThreadSafeSingleton {// 私有静态变量,存储单例实例private static volatile ThreadSafeSingleton instance;// 私有构造函数,防止外部实例化private ThreadSafeSingleton() {}// 公有静态方法,获取单例实例public static ThreadSafeSingleton getInstance() {// 双重检查锁定,确保只有一个线程创建实例if (instance == null) {synchronized (ThreadSafeSingleton.class) {// 再次检查实例是否已经被创建if (instance == null) {instance = new ThreadSafeSingleton();}}}return instance;}// 其他业务方法public void doSomething() {System.out.println("Singleton instance is doing something.");}
}

instance 变量使用了 volatile 关键字,确保多线程环境下对它的读取和写入操作都是原子的,并且对所有线程可见。

构造函数 ThreadSafeSingleton() 被声明为私有,确保外部无法直接实例化 ThreadSafeSingleton。

getInstance() 方法使用了双重检查锁定机制,在多线程环境下保证了只有一个线程创建实例。首先检查 instance 是否为 null,如果为 null,则进入同步块,再次检查 instance 是否为 null,如果仍然为 null,则创建一个新的 ThreadSafeSingleton 实例。

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

相关文章:

  • OpenHarmony实战开发-Grid和List内拖拽交换子组件位置。
  • 设计模式:时序图
  • 前端性能监控(面试常见)
  • react17 + antd4 如何实现Card组件与左侧内容对齐并撑满高度
  • Rust入门-Hello World
  • 堆放砖块-第12届蓝桥杯选拔赛Python真题精选
  • 019——IIC模块驱动开发(基于EEPROM【AT24C02】和I.MX6uLL)
  • 【开发篇】十三、JVM基础参数设置与垃圾回收器的选择
  • 多维 HighCharts
  • 单细胞RNA测序(scRNA-seq)cellranger count的细胞定量和aggr整合
  • Unity URP 2021 Release-Notes
  • 最新IntelliJ IDEA 2024.1 安装和快速配置教程
  • 24应届生求职中QAQ
  • centos7离线安装postgresql13
  • 【JavaSE】搞定String类
  • 数字乡村创新实践探索农业现代化与农村治理现代化新路径:科技赋能农村全面振兴与农民幸福生活
  • 【从零开始手搓12306项目】四、12306是如何成为全球最忙碌的网站之一?
  • WebKit简介及工作流程
  • 软考-系统集成项目管理中级--进度管理(输入输出很重要!!!本章占分较高,着重复习)
  • AndroidAutomotive模块介绍(一)整体介绍
  • 【开发问题记录】Nacos修改服务实例权重时报错
  • 高级IO和5种IO模型
  • OpenHarmony轻量系统开发【7】驱动之I2C显示OLED屏幕
  • C#:循环中断
  • 34. UE5 RPG实现鼠标点击移动
  • 《二》Qt Creator工具介绍与使用
  • 20240415金融读报:市场信贷不能过于宽松声音碳领域新增文件
  • 2024年第十五届蓝桥杯研究生组题目总结(Java、Python、C++)
  • MindOpt APL向量化建模语法的介绍与应用(2)
  • 深入理解图形处理器(GPU):加速人工智能和大数据计算的引擎