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

单例设计模式双重检查的作用

先看双重校验锁的写法

public class Singleton {/*volatile 修饰,singleton = new Singleton() 可以拆解为3步:1、分配对象内存(给singleton分配内存)2、调用构造器方法,执行初始化(调用 Singleton 的构造函数来初始化成员变量)。3、将对象引用赋值给变量(执行完这步 singleton 就为非 null 了)。若发生重排序,假设 A 线程执行了 1 和 3 ,还没有执行 2,B 线程来到判断 NULL,B 线程就会直接返回还没初始化的 instance 了。volatile 可以避免重排序。*/private volatile static Singleton singleton;private Singleton() {}public static Singleton getSingleton() {if (singleton == null) {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();}}}return singleton;}}

为什么要进行两次非空校验?

第一个 if 判断是为了减少性能开销,不用走 synchronized 代码,避免多余的加锁操作,以及锁的等待和竞争

第二个 if 判断是为了避免生成多个对象实例。比如在未创建实例的情况下,A线程和B线程都通过了第一次校验,这时如果通过竞争B线程拿到了锁就会执行一次 new 操作,生成一个实例,然后 B 执行完了 A 就会拿到资源的锁,如果没有第二次判断的话,这时A线程也会执行一次 new 操作,这里就出现了第二个类实例,违背了单例原则。

相关文章:

  • 视觉应用线扫相机速度反馈(倍福CX7000PLC应用)
  • 数据结构与算法-差分数组及应用
  • 苹果入局AI手机 iOS 18将应用AI功能
  • 查看nginx安装/配置路径,一个服务器启动两个nginx
  • Ansys Mechanical|学习方法
  • 群晖NAS本地部署并运行一个基于大语言模型Llama2的个人本地聊天机器人
  • JavaScript中 Map与reduce的应用
  • Java实现数字替代功能:卡码网54替换数字实践案例
  • Qwen2在Java项目中如何实现优雅的Function_Call工具调用
  • mongodb 集群安装
  • TalkingData数据统计:大数据时代的洞察与应用
  • 堆优化版Dijkstra求最短路-java
  • 高并发系统中面临的问题 及 解决方案
  • 怪物猎人物语什么时候上线?游戏售价多少?
  • 汇编程序入门指南
  • [译]Python中的类属性与实例属性的区别
  • Angular Elements 及其运作原理
  • JS笔记四:作用域、变量(函数)提升
  • react 代码优化(一) ——事件处理
  • SpiderData 2019年2月25日 DApp数据排行榜
  • uva 10370 Above Average
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 从零开始的无人驾驶 1
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 服务器从安装到部署全过程(二)
  • 前嗅ForeSpider教程:创建模板
  • 算法-插入排序
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • UI设计初学者应该如何入门?
  • #APPINVENTOR学习记录
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (3)STL算法之搜索
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (独孤九剑)--文件系统
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (四)事件系统
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • 、写入Shellcode到注册表上线
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .DFS.
  • .Net6 Api Swagger配置
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @SpringBootConfiguration重复加载报错
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [000-01-011].第2节:持久层方案的对比
  • [240903] Qwen2-VL: 更清晰地看世界 | Elasticsearch 再次拥抱开源!
  • [AIGC] 解题神器:Python中常用的高级数据结构
  • [Bada开发]初步入口函数介绍
  • [BUUCTF 2018]Online Tool
  • [C#]winform基于深度学习算法MVANet部署高精度二分类图像分割onnx模型高精度图像二值化
  • [C++] vector list 等容器的迭代器失效问题