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

单例模式(饿汉模式,懒汉模式)

一.饿汉模式

饿汉模式就是在类加载的时候就开始创建成员变量

二.懒汉模式

懒汉模式就是在调用这个方法的才去创建这个实例

三.线程安全问题

在饿汉模式中是不会出现线程安全问题的因为对它的变量只是读但不改变

在懒汉模式中是可能出现这个线程安全问题的因为对它所创建的变量会读也会写

那么导致它线程不安全的原因是什么?

假设有两个线程,第一个线程先去访问的时候同样第二个线程也可能会访问那么此时他们就会创建两个实例那么就出现了线程安全问题

那么怎么改变让它线程安全呢

那么我们就想到使用加锁的方式(synchronized)

那么这样就使得当多个线程访问的时候就只有一个实例变量

但是假设当你第一个线程已经访问了并且创建好了实例那么你第二个线程再次去访问的时候那么是不是还是会进行加锁解锁但已经有了结果就该直接返回那么是不是就多消耗了资源所以我们应该还在外面加上一个if语句来使得这个变的更高效

但是可能会出现指令重排序的问题

singTon2 = new SingTon2();

它会有三个指令分别为1.申请内存空间2.使用构造方法来初始化实例3.赋值给singTon2引用

系统可能有时候想到优化就会将这个顺序变成132但是也不会影响整个结果的改变但是这里若变成132的话当第一个线程去访问的时候在这个132的顺序下正好将3走完(此时的引用不是null是一个尚未初始化的对象而已)此时线程被调度走了就开始让第二个线程重新开始那么它此时就会读到这个3的引用然后就会直接访回结果那么此时数据就错误

那么我们就要使用volatile它可以禁止指令重排序。

http://www.xdnf.cn/news/14961.html

相关文章:

  • LeetCode 3306.元音辅音字符串计数2
  • 论文阅读|汽车虚拟环绕音响系统设计与实现策略的比较研究
  • Oracle存储过程导出数据到Excel:全面实现方案详解
  • C++笔记之使用bitset对uint32_t类型变量对位状态判断
  • Spring Cloud 企业项目技术选型
  • 华为泰山服务器重启后出现 XFS 文件系统磁盘“不识别”(无法挂载或访问),但挂载点目录仍在且无数据
  • 分布式接口幂等性的演进和最佳实践,含springBoot 实现(Java版本)
  • 前端规范化设计详解
  • JavaScript基础篇——第一章 JavaScript基础的认识
  • 《Java 反射全攻略1》
  • 【读代码】GLM-4.1V-Thinking:开源多模态推理模型的创新实践
  • 开源 python 应用 开发(四)python文件和系统综合应用
  • linux wsl2 docker 镜像复用快速方法
  • 分布式理论:CAP、Base理论
  • 无重叠区间问题
  • HDLBits刷题笔记和一些拓展知识(十一)
  • git-安装 Gerrit Hook 自动生成changeid
  • Java-Collections、Map
  • 力扣-136.只出现一次的数字
  • C语言宏替换比较练习
  • .NET9 实现对象深拷贝和浅拷贝的性能测试
  • C#使用Semantic Kernel实现Embedding功能
  • 自动化一次通过率
  • LLM探索的时代
  • 【web安全】SQLMap 参数深度解析:--risk 与 --level 详解
  • leetcode202.快乐数
  • 【数据结构】复杂度分析
  • 【王树森推荐系统】召回11:地理位置召回、作者召回、缓存召回
  • LeetCode 1248.统计优美子数组
  • Coze智能体工作流:1分钟生成10个儿童卡通童话故事视频,无需剪辑