volatile官方文档解释

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

一、描述:

官方文档中对volatile中描述中,写到:

This means that changes to a volatile variable are always visible to other threads. What's more, it also means that when a thread reads a volatile variable, it sees not just the latest change to the volatile, but also the side effects of the code that led up the change.

这句话前半段很好理解,可以解释为:用volatile修饰的变量对其他变量是可见的,volatile变量总是可以读取到对该变量的最新修改值。而后半段“but also the side effects of the code that led up the change”,不太好理解,直译为:也会受到改变volatile变量值的代码的副作用影响。那么什么是副作用影响呢,官方文档中并没有给出具体例子。

 

二、解释:

副作用影响为没有对volatile变量执行原子操作,volatile只对读、写两种操作具有原子,如果一个变量用volatile修饰,但是对该变量的操作并没有执行原子操作,那么读取到该变量的值会错误,如下例子:

volatile int i = 0; 

线程1
i++;


线程2
print(i);

线程1对变量 i 执行了加操作,在进行加1的过程中,线程2读取了变量 i,那么线程2读取的变量值可能为0或者1,因为i++不是原子操作,如果不使用锁的情况下,让线程2读取的值为1,可以做以下修改:

volatile int i = 0; 

线程1
i=1;


线程2
print(i);

线程1将变量加1的操作改为了赋值1,因为volatile单独赋值时原子性的,并且在线程1执行过程中,是符合happen-before线程2的,所以线程2读取的值为1。

volatile实现可见性的原理解释 在java并发编程中,一定绕不开volatile、synchronized和lock几个关键字,其中volatile关键字是用来解决共享变量(类成员变量、类的静态成员变量等)的可见性问题的,非共享变量(方法的局部变量)是分配在JVM虚拟机的栈中,是线程私有的,不涉及可见性问题。那么什么是可见性? 可见性:在JAVA规范中是这样定义的:java编程语言允许线程访问共享变量,为了确保共享变量能被准确和... 阅读详情

相关推荐

Vodal一个包含动画的vue模态框

Vodal 一个包含动画的vue模态框

慎用volatile关键字

看了某邮件列表里的大争论,一方支持使用volatile,一方反对。反方的理由如下: 1)volatile很怪异。嗯。如果对c++很熟悉,就会觉得volatile的确是个太与众不同的关键词。c++里面并没有线程啊同步啊之类的关键词,就一个volatile孤零零摆在那里。 2)volatile在大多数平台大多数编译环境下是不起作用,在少数起作用的场合代价高昂。这点我没有测试过哈,不过的确有很多时候,

runyon的博客 611

java中volatile关键字的含义

原文链接 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。 synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchron

阳光宅男 1199

自顶向下学习volatile关键字

0.前言 本文仅个人对于volatile的理解与整理。 对于理解本文的人,当你用这篇文章作为阶梯,并爬越它的时候,最后你会认识到这篇文章只不过是用幻想吹出来的肥皂泡、是无意义的。 你必须超越这篇文章,然后才能正确看世界。毕竟世界的意义在于世界之外。 1.层次架构 先记住这三个层面各自的术语。开发者层面的volatile「本文主角」,Java虚拟机层面的Java内存模型「先行发生原则」,CPU层面的CPU缓存体系、CPU内存重排序和内存屏障。final和synchronized这两者不是本文探讨对象故略。 三

mizuhokaga的博客 447

volatile关键字浅析

volatile关键字浅析在并发编程中,volatile是很常用的一个修饰符。JDK官方文档是这么形容volatile的:The Java programming language provides a second mechanism, volatile fields, that is more convenient than locking for some purposes. A field

Ares的专栏 711

volatile 修饰的变量"副作用/序列点"问题

这个问题是因为这个帖子而起, 也是这段代码有点不明白. 和自己预期的值不一样, 所以就编译反汇编看了下. 编译工具:  Code:blocks(GCC), CPU(Intel Core i3 32位), OS(windows 7 / 32bit). 参考书籍:  深入理解计算机系统(Bryant & Hallaron) 更多了解关于 volatile 可以参考: http://blog.cs

     KISSMonX 1613

PyTorch学习之自动求导机制-Volatile标志

修改官方文档的错误 运行官方文档中的代码可能会报错(维度不一致): Traceback (most recent call last): File "<stdin>", line 1, in <module> File "e:\Anaconda3\lib\site-packages\torch\nn\modules\module.py", lin...

668

java中volatile解释

http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html http://blog.sina.com.cn/s/blog_4e1e357d0101i486.html http://www.ibm.com/developerworks/cn/java/j-jtp06197.html   与锁相比,Volatile 变量是一...

gaile的专栏 354

Java中的volatile

volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,自然是美事一桩。为了能比较清晰彻底的理解volatile,我们一步一步来分析。首先来看看如下代码 上面这个例子,模拟在多线程环境里,t1线程对flag共享变量修改的值能否被t2可见,即是否输出 “-----flag被设置为

HGW的博客 2万+

volatile原子性详细解释

volatile关键字在Java中主要用于确保变量的可见性和有序性,但它不能保证非原子操作的原子性。volatile可以用于某些简单的状态标识场景,但对于需要多步骤操作的变量(如自增、自减等),volatile无法解决竞态条件问题。如果需要确保原子性,可以使用关键字、Atomic类或Lock机制。理解volatile的作用和局限性,对于编写高效、安全的并发程序至关重要。在实际开发中,应根据具体的需求选择合适的同步机制。对于简单的标志位或状态变量,可以考虑使用volatile

Flying_Fish_roe的博客 1567

Volatile最终解释

java中volatile的最终解释,从HotSpot源码到CPU缓存StoreBuffer

weixin_56892092的博客 1539

java中volatile 解释说明

volatile通过内存屏障实现变量的可见性;禁止编译器和处理器重排序,保证有序性;不提供原子性,不能用于复合操作。✅适用条件写操作不依赖当前值(如或者只有一个线程写,其他线程只读否则,请使用或包中的原子类。如需进一步了解内存屏障或 JMM 模型,也可以继续提问!

qq_45688811的博客 850

volatile 详细解释

如果我们需要深入的了解volatile这个关键字,我们首先需要了解关于Java的内存模型(JMM),所以我们首先来看一下Java的内存模型; ![java](https://img-blog.csdnimg.cn/20200410192927804.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_a...

Chenpeng02的博客 390

volatile的功能以及应用解释

Double-Checked Locking (DCL) 是一种常见的多线程编程模式,用于减少同步开销,但它在某些语言和环境中存在潜在问题。这种设计既保证了线程安全,又最大限度地减少了同步带来的性能影响,是多线程环境下实现高效单例模式的经典解决方案。当类首次被主动引用(如访问静态字段、调用静态方法)时,JVM 会执行类的初始化,自动生成一个名为。JVM 在类加载阶段(如初始化静态变量)的线程安全性是由。的修改能立即对其他线程可见,而不是缓存在线程本地内存中。:依赖类加载的线程安全(如问题中的示例)。

2403_87509572的博客 844

volatile,从JVM的层面解释并发

文章目录一、前言二、硬件层面解决缓存不一致的两种方式2.1 缓存不一致问题2.2 两种解决方式2.2.1 总线锁2.2.2 缓存一致性协议三、并发编程中的三个概念3.1 原子性3.1.1 原子性定义3.1.2 原子性举例3.2 可见性3.2.1 可见性定义3.2.2 可见性举例3.3 有序性3.3.1 有序性定义3.3.2 有序性举例(单线程下指令重排不会造成线程安全问题)3.3.3 有序性举例(多线程下指令重排会造成线程安全问题)四、Java内存模型4.1 原子性4.2 可见性4.3 有序性与指令重排序五

毛毛的专栏 869

关于volatile的用法解释

volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值(因为从寄存器中读取要比从RAM中读取更快,编译器可能会做这样的优化),如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序: short flag; void test() { do1(); whil

weixin_43148648的博客 546

volatile关键字解释

volatile概念:volatile关键字的主要作用是使变量在多线程间可见。示例1:package test;public class RunThread extends Thread{ private boolean isRunning = true; //private volatile boolean isRunning = true; private void setRun...

anxiqi4357的博客 168

volatile 关键字的详细解释

是 Java 中的一个关键字,用于修饰变量,确保该变量在多个线程间的可见性。在并发程序中,volatile 的作用通常与线程同步相关,尤其是在多线程环境下,当一个线程修改了 volatile 变量的值,其他线程会立即看到这个变化。volatile 非常适合用于线程间共享的状态标志,如在某个线程中标记一个事件,其他线程通过检查该标志来决定是否执行某个操作。在某些并发操作中,多个线程操作同一变量时,可以使用 volatile 保证数据的一致性,确保每个线程都会看到最新的值。

weixin_46508088的博客 1149

Java volatile 关键字解释 用法原理 并发编程特性

文章目录0. 前言1. java内存模型与原子性,可见性和有序性2. volatile关键字2.1 volatile保证原子性吗?2.2 volatile能保证有序性吗?2.3 volatile底层实现机制3. 正确使用volatile关键字3.1 状态标志3.2 双重检查模式 DCL4. 总结Ref 0. 前言 有时仅仅为了读写一个或者两个实例域就使用同步的话,显得开销过大,volatile关键字为实例域的同步访问提供了免锁的机制。如果声明一个域为volatile,那么编译器和虚拟机就知道该域是可能被另一

小鹅鹅的博客 7219
上一篇: 重识JVM(1)- 冯诺依曼体系
下一篇: 重识JVM(2) - JAVA内存模型
祥先生
博客等级 码龄14年 48粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值