不卖关子,答案是具有原子性,但是在某些情况下也没有原子性。
1.具有
准确的说volatile 是具有可见性的,其核心原理是当对volatile标记的变量进行修改时,会将其他缓存的线程中的的变量值清除。当其他缓存中的线程读取此变量值时,会首先向主线程中缓存获取到消息,将新值传给当前线程并赋值。每次变量更新volatile变量时都会重复此步骤。
所以,从这种意义上来说,入门书籍《Java编程思想》告诉我们。,定义long或double变量时,如果使用volatile关键字,就会获得(简单的赋值与返回操作)原子性。
2.不具有
但是volatile有个条件,用在getAndOperator场合是不具备原子性的。比如在做n =n+1,n++这种。因为在执行此类操作时有三个步骤:获取,自增,赋值。其jvm指令中,有内存屏障的介入,内存屏障会将已经发生写入的值同步到各个线程内存中。
因此在此种情况下不具备原子性。
分享到:
相关推荐
对volatile的原子性做探究,加上自己的实验代码和实验结果! Case多核?单核?是否有volatile是否编译器优化-O2结果!
GD32F303各种使用场景代码实现
线程安全、volatile关键字、原子性、并发包、死锁、线程池学习笔记
java代码-volatile原子性
1. 过期数据 2. 锁的可见性 4. 原变量 1. JSL 第三版 2. Java Concurrency in Practice
volatile 的字面含义是易变的,那么将一个变量指示为volatile 是什么意思呢?是告诉编 译器这个变量是易变的?事实上也是如此。在多任务、中断等环境下,变量可能被其他的任 务改变,而编译器无法发现,volatile ...
从JUC中的AQS引入,讲解Java volatile与AQS锁内存可见性
详细说明 并举例说明了VOlatile的作用及用法,特别是嵌入式程序员要注意的
volatile可以看成是synchronized的一种轻量级的实现,但volatile并不能完全代替synchronized,volatile有synchronized可见性的特性,但没有synchronized原子性的特性。 可见性即用volatile关键字修饰的成员变量表明...
一般对于volatile的解释是这样的:将变量定义为volatile可以防止编译器对变量进行优化,每次均从内存中访问变量,而不是寄存器。既然让编译器优化可以提高访问速度,那为什么又要不用它以及什么时候不用它?其实主要...
容易忽略的变量声明,但是很重要 volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.
C中的volatile用法 ,以前编程的时候不是很注意这个关键字,后来在AVR使用的时候被搞得一塌糊涂。最后发现是编译器优化造成的
一般说来,volatile用在如下的几个地方: 1、中断服务程序中修改的供其它程序检测的变量... 另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实
java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java ...
我们在学习C语言的32个关键字时,大家都不太注意volatile这个关键字,volatile是一个类型修饰符。volatile的中文意思是“易变的”。那么在程序中我们在什么情况下才使用他呢?我们在分析内核时经常看到这个关键字的...
volatile的用法,在写代码正确使用volatile,正确理解volatile的用法,增强代码的健壮性