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

多线程---单例模式小结

文章目录

  • synchronized和volatile负责场景的不同
    • 1.保证变量的可见性问题
    • 2.禁止指令重排序
  • wait和notify
    • 1.wait和sleep的区别
    • 2. notify
  • 单例模式
    • 饿汉模式
    • 懒汉模式
  • 生产者消费者模型

synchronized和volatile负责场景的不同

synchronized:
是处理多个线程修改和修饰代码块
volatile:

1.保证变量的可见性问题

Java 线程不是直接读写主内存的变量,而是两层:
主内存:共享区域,所有线程共用
工作内存:每个线程私有缓存(CPU 缓存、寄存器)
正常普通变量流程:
线程第一次读变量:从主内存拷贝一份到自己的工作内存
后续反复读、改:只操作自己本地缓存,不再碰主内存
修改完,也不会立刻刷回主内存
👉 后果:线程 A 改了变量,只改了自己缓存;线程 B 一直读自己旧缓存,永远看不到新值。
volatile 靠 内存屏障 实现可见性:
写屏障:写之后,强制刷新缓存到主存
读屏障:读之前,强制失效本地缓存、拉取主存
没有加锁、没有阻塞,只是强制内存读写规则,所以非常轻量、性能高。

2.禁止指令重排序

JVM在优化操作的过程中,在单线程的工作模式下,会将一些操作将其内部的指令进行重新排序,但是这个在多线程的情况下,会影响多线程的工作,产生bug
经典例子就是单例模式下的懒汉模型.

wait和notify

1.wait和sleep的区别

1.wait提供两个版本,死等和带有超时的版本,sleep只有带时间的
2.sleep只能通过interrupt提前终止,而wait可以通过notify来唤醒,但也可以同时同interrupt来唤醒
3.wait阻塞是会释放锁(强制要求),sleep和锁无关,不要求搭配锁,也不会释放.

2. notify

线程是随机调度的,某个线程t1,某个线程希望后执行,另一个线程t2先执行,就可以让t1.wait等待,等到t2执行完一定逻辑之后,notify通知t1,让t1继续执行.

单例模式

饿汉模式

classSingleton{privatestaticSingletoninstance=newSingleton();publicstaticSingletongetSingleton(){returninstance;}privateSingleton(){};}

饿汉模式下,就不存在线程不安全的情况

懒汉模式

classSingletonLazy{privatestaticvolatileSingletonLazyinstance=null;privatestaticObjectlocker=newObject();publicstaticSingletonLazygetSingleton(){if(instance==null){synchronized(locker){if(instance==null){instance=newSingletonLazy();}}}returninstance;}privateSingletonLazy(){};}

这里要注意要加上volatile这一个关键字,不然在instance = new SingletonLazy()这一个操作的时候,会指令重排序,在多线程下会产生bug,双重if可以省去很大的开销,双重if分别的作用
第一个if,大大的增加了效率,后面有很多线程进来,但是先要进行第一if判断发现已经有实例对象了,就不会接着往后走了.
举个场景:
线程 A、线程 B 同时通过第一层 if,都发现 instance 是 null
线程 A 先抢到锁,进去 new 对象,释放锁
线程 B 再抢到锁,如果没有内层 if,会再次 new 一个新对象,破坏单例
有了内层 if:线程 B 抢到锁后再判断一次,发现已经有实例了,直接跳过不创建。

生产者消费者模型

publicclasstest{publicstaticvoidmain(String[]args){// 队列容量2MyBlockingQueuequeue=newMyBlockingQueue(2);// 生产者:只生产 1~10 数字newThread(()->{for(inti=1;i<=10;i++){try{queue.put(i+"");System.out.println("生产数字:"+i);Thread.sleep(300);}catch(InterruptedExceptione){}}}).start();// 消费者:一直取数字newThread(()->{while(true){try{Stringnum=queue.take();System.out.println("消费数字:"+num);Thread.sleep(500);}catch(InterruptedExceptione){}}}).start();}}
publicclassMyBlockingQueue{privateString[]data=null;privateinthead=0;privateinttail=0;privateintsize=0;privateObjectlocker=newObject();publicMyBlockingQueue(intcapacity){data=newString[capacity];}publicvoidput(Stringelem)throwsInterruptedException{synchronized(locker){while(size==data.length){locker.wait();}data[tail]=elem;tail++;if(tail>=data.length){tail=0;}size++;locker.notify();}}publicStringtake()throwsInterruptedException{synchronized(locker){while(size==0){locker.wait();}Stringret=data[head];head++;if(head>=data.length){head=0;}size--;locker.notify();returnret;}}}

下面是一个阻塞队列的一个实现代码重点就是要用while而不能用if
防止虚假唤醒.

http://www.jsqmd.com/news/722518/

相关文章:

  • 数据科学家转型记:从分析报告到落地产品的关键一跃
  • Tidyverse 2.0报告流水线重构指南:5步实现从卡顿到毫秒级渲染
  • 阿里P8问:怎么让LLM老老实实调工具?候选人答“提示词写清楚就行”。面试官笑了:“那你写一个我看看。”我想90%的人栽在这。
  • 为什么你的`report.Rmd`编译要83秒?——Tidyverse 2.0惰性求值+缓存策略深度拆解
  • 仅限三甲医院IT科与通过HL7认证的ISV可见:C# FHIR 2026适配白皮书(含国家药监局NMPA最新审评要点+2026 Q1现场检查高频扣分项清单)
  • 独立TBOX,才是车载通信绕不开的终极答案
  • 别让AI‘看人下菜碟’:实测GPT-4和PaLM-2在招聘场景下的偏见与应对
  • Fogwise AIRBox Q900 AI边缘计算盒性能与应用解析
  • PHP 9.0 + AI Bot开发避坑清单:5大异步陷阱(EventLoop阻塞、Promise链断裂、Stream超时失控、Fiber上下文丢失、AIO驱动兼容性)全曝光
  • AI语言中立化技术如何优化全球客服中心运营
  • BilibiliDown终极指南:免费开源工具轻松下载B站视频的10个实用技巧
  • 别再只会console.log了!TypeScript调试中这5个Console方法让你效率翻倍
  • 别再手动记坐标了!用PyQt5的QGraphicsView写个图片坐标拾取器(附完整源码)
  • 保姆级教程:在Windows上用QT Creator 6.5集成STK12的3D地球控件(附常见错误修复)
  • 2026成都防水补漏选品推荐 5类服务商技术实测对比 - 优质品牌商家
  • ARM架构FPMR寄存器:浮点运算控制与优化
  • 为什么你的音乐游戏延迟总是比别人高?揭秘ASIO技术如何实现毫秒级音频同步
  • 数字孪生“大脑”揭秘:机器学习模型如何驱动虚实共生
  • Microsoft与Postel合作推出创新的新数据和AI驱动解决方案,优化意大利中小企业与其客户的关系
  • 2026年工程机械上门维修推荐:合规、时效与成本管控全解析 - 优质品牌商家
  • 快递包裹检测数据集VOC+YOLO格式2914张6类别
  • 如何用Mermaid快速创建专业图表:面向新手的终极指南
  • 2026年3月远控多页排烟口厂家推荐,正压送风口/远控多页排烟口/空调风机/防火排烟阀,远控多页排烟口公司哪家权威 - 品牌推荐师
  • 单域名、多域名、通配符SSL证书区别在哪?怎么选更适合网站
  • 三维风场可视化:如何让气象数据在数字地球上“流动“起来
  • 终极游戏压枪指南:5分钟掌握罗技鼠标宏精准射击技巧
  • 慢SQL排查三板斧:SHOW PROCESSLIST + 慢查询日志 + EXPLAIN 实战
  • IgH EtherCAT 从入门到精通:第 30 章 实战:高可用 EtherCAT 系统设计
  • 2026 年 AI 语音转文字行业趋势,5 款主流工具长期价值对比,选对不踩坑
  • 基于Electron-Vue架构的跨平台视觉对比系统MegSpot技术深度解析