问答1 问答5 问答50 问答500 问答1000
网友互助专业问答平台

volatile关键字及其作用

提问网友 发布时间:2025-01-08 21:00
声明:本网页内容为用户发布,旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:1656858193@qq.com
1个回答
热心网友 回答时间:2025-04-01 05:24
本文主要介绍Java语言中的volatile关键字,内容涵盖volatile的保证内存可见性、禁止指令重排等。

1 保证内存可见性

1.1 基本概念

可见性是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果,另一个线程马上就能看到。

1.2 实现原理

当对非volatile变量进行读写的时候,每个线程先从主内存拷贝变量到CPU缓存中,如果计算机有多个CPU,每个线程可能在不同的CPU上被处理,这意味着每个线程可以拷贝到不同的CPU cache中。

volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,保证了每次读写变量都从主内存中读,跳过CPU cache这一步。当一个线程修改了这个变量的值,新值对于其他线程是立即得知的。

2 禁止指令重排

2.1 基本概念

指令重排序是JVM为了优化指令、提高程序运行效率,在不影响单线程程序执行结果的前提下,尽可能地提高并行度。指令重排序包括编译器重排序和运行时重排序。

在JDK1.5之后,可以使用volatile变量禁止指令重排序。针对volatile修饰的变量,在读写操作指令前后会插入内存屏障,指令重排序时不能把后面的指令重排序到内存屏障后面。

2.2 指令重排带来的问题

如果一个操作不是原子的,就会给JVM留下重排的机会。

如果线程A中的指令发生了重排序,那么B中很可能就会拿到一个尚未初始化或尚未初始化完成的context,从而引发程序错误。

2.3 禁止指令重排的原理

volatile关键字提供内存屏障的方式来防止指令被重排,编译器在生成字节码文件时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。

JVM内存屏障插入策略:

每个volatile写操作的前面插入一个StoreStore屏障;

在每个volatile写操作的后面插入一个StoreLoad屏障;

在每个volatile读操作的后面插入一个LoadLoad屏障;

在每个volatile读操作的后面插入一个LoadStore屏障。

2.4 指令重排在双重锁定单例模式中的影响

基于双重检验的单例模式(懒汉型)

instance= new Singleton()并不是一个原子操作,其实际上可以抽象为下面几条JVM指令:

上面操作2依赖于操作1,但是操作3并不依赖于操作2。所以JVM是可以针对它们进行指令的优化重排序的,经过重排序后如下:

指令重排之后,instance指向分配好的内存放在了前面,而这段内存的初始化被排在了后面。在线程A执行这段赋值语句,在初始化分配对象之前就已经将其赋值给instance引用,恰好另一个线程进入方法判断instance引用不为null,然后就将其返回使用,导致出错。

解决办法

用volatile关键字修饰instance变量,使得instance在读、写操作前后都会插入内存屏障,避免重排序。

3 适用场景

(1) volatile是轻量级同步机制。在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,是一种比synchronized关键字更轻量级的同步机制。

(2) volatile**无法同时保证内存可见性和原子性。加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性**。

(3) volatile不能修饰写入操作依赖当前值的变量。声明为volatile的简单变量如果当前值与该变量以前的值相关,那么volatile关键字不起作用,也就是说如下的表达式都不是原子操作:“count++”、“count = count+1”。

(4) 当要访问的变量已在synchronized代码块中,或者为常量时,没必要使用volatile;

(5) volatile屏蔽掉了JVM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

想获取更多知识和学习资料可以扫描下方二维码或是点击链接

mp.weixin.qq.com/s/vkvY...

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

无际单片机:单片机volatile关键字的作用? 方言:怎么学习上海话?有没有相关的电影或者软件? 怎么学说上海话 梦见挖地修路是什么意思? things是什么中文意思 骑乌龟追宝马猜成语 ...显现的是工厂模式,这是怎么回事?该怎么解决? ...键和关机键,显示的是工厂模式,没有清除数据 赛尔号白虎的分身电虎和战虎分别怎么打?需要什么精灵?刷什么?详细些... 哪家超黄金平台的纸黄金价格走势图最准确?建行纸黄金走势图可信吗? 成都的ICP怎么这么贵?难度很大嘛,如果自己去办的话难度大不,需要什么... 威海星泽化妆品有限公司怎么样? 长春市星泽商贸有限公司怎么样? 北京星泽商贸有限公司怎么样? 南宁市星泽商贸有限公司怎么样? 供应链服务 江西天心泽贸易有限公司怎么样? 大米让不让过安检? 大米能不能带上长途客车 大米能带上长途客车吗 小米5支持miui11吗 发明专利与实用新型专利区别所在 为什么水珠会弹起来? 为什么水滴在水面上会弹起小水滴 水波为什么会反弹 请问这些成语用英语怎么翻译,乐于助人团结友善美丽大方言行洒脱勤奋刻 ... 急求“乐于助人”英文翻译! 为什闪电打雷的时侯有时会跳闸 北京城市学院IT工程监理是干什么的 IT监理IT监理业务内容 英魂之刃战略版攻略 新手入门指南 手机导游软件景点讲解app哪个好 ...喜欢男生时频繁的出现在男生面前,男生每次见着她就立刻停下手里的... ...男生的时候频繁的出现在男生面前,男生每次见着她就立刻停下手里的... 为什么过去女生喜欢男生时经常去他面前,他总放下手里事情先处理她交代的... 土耳其国家足球队球队资料 在车上连上蓝牙了为啥没有声音? 智能手环品牌质量排行榜前十名2024,运动/智能手环推荐十大品牌 什么品牌运动手环好 运动手环牌子哪个好 运动手环哪个牌子最好
Top