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

Java中的volatile关键字

volatile是一种轻量级的同步机制,它相比于synchronized这种重量级锁更轻量,因为它不会造成线程上下文的切换,但是同步性更差,volatile关键字可以保证变量的可见性以及禁止指令重排序。

可见性

可见性指一个值被线程修改了,其余的线程能立刻看见被修改的值,使用volatile关键字修饰的变量可以保证可见性。

如何保证的可见性?
首先来看看Java的内存模型

每个线程都有自己的工作内存,这个工作内存是每个线程独占的,对其余线程是不可见的。
主内存中存储的时共享变量,线程想要修改共享变量的值时,是不能直接去主内存修改的,而是要同步到自己的工作内存中修改,之后再同步到主内存中,这里通过cas来保证线程安全。

如果是volatile修饰的变量,那么每个线程只能去主内存读取这个变量,而不能读取自己的工作内存,从而保证了可见性。

有序性

有序性指程序按照代码先后顺序执行,在java中,为了效率编译器可能会将指令重排序,也就是不按照代码顺序执行,指令重排序对于单线程是没有影响的,但是在多线程下有可能会出错。

比如说下面这段代码,这是使用双重判定锁实现单例模式模式的原理。

其中去new Singleton()这一步不是原子性的,可以分为三步:

  1. 为 uniqueInstance 分配内存空间
  2. 初始化 uniqueInstance
  3. 将 uniqueInstance 指向分配的内存地址

如果不禁止指令重排序的话,那么有可能线程1在new Singleton()的时候,先执行第三步,然后此时线程2来判断uniqueInstance不为null,直接return,就返回了一个没有初始化的对象,所以这里用了volatile来禁止指令重排序。

相关文章:

  • AI自动文献综述——python先把知网的文献转excel
  • 免费高质量贴图(Textures) 网站推荐
  • RabbitMq C++客户端的使用
  • DeepSeek大模型在政务服务领域的应用
  • 四种 No-SQL
  • 应急响应靶机练习-Linux2
  • 手搓智能音箱——语音识别及调用大模型回应
  • 用Java来创建数字游戏
  • 基于springboot的无人智慧超市管理系统
  • 蓝桥杯2023年第十四届省赛真题-整数删除 暴力-->链表+小根堆
  • 203.移除链表元素
  • 免费影视片库
  • HarmonyOS第22天:解锁鸿蒙服务开发
  • 二叉树题目
  • 冷热数据分层存储:提高效率与降低成本
  • 数据结构(泛型)
  • 大模型MCP协议与Function Calling:构建更智能的AI生态系统
  • 大模型微调中显存占用和训练时间的影响因素
  • OTP单片机调试工具之—单线数据编码
  • RCore学习记录001
  • 商务部:对原产于美国、欧盟、台湾地区和日本的进口共聚聚甲醛征收反倾销税
  • 北方首场高温将进入鼎盛阶段,江南华南多地需警惕降雨叠加致灾
  • 陕西省市监局通报5批次不合格食品,涉添加剂超标、微生物污染等问题
  • 国寿资产获批参与第三批保险资金长期投资改革试点
  • 习近平向多哥新任领导人致贺电
  • 硅料收储挺价“小作文”发酵光伏板块罕见大涨,知情人士:确实在谈