Java volitile关键字 Java volatile 关键字用来标记一个Java变量为“存储于主内存”。更准确地说是,每一次针对volatile变量的读操作将会从主内存读取而不是从CPU的缓存读取;每一次针对volatile变量的写操作都会写入主内存,而不仅仅是写入CPU缓存。 实际上,从J ...
分类:
编程语言 时间:
2018-08-03 16:22:15
阅读次数:
162
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。 例如: volatil ...
分类:
其他好文 时间:
2018-07-31 17:13:12
阅读次数:
158
一 引言 听说在Java 5之前volatile关键字备受争议,所以本文也不讨论1.5版本之前的volatile。本文主要针对1.5后即JSR-133针对volatile做了强化后的了解。 二 volatile的特性 开门见山,volatile变量自身具有以下特性: 可见性(最重要的特性)。对一个v ...
分类:
编程语言 时间:
2018-07-22 17:09:22
阅读次数:
206
一 引言 在说volatile的内存语义时,讲过这样一句话:想要理解透volatile特性有一个很好的方法,就是把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。所以其实锁的释放和获取与volatile的写和读具有相同的内存语义。 二 锁的释放-获取建立的happ ...
分类:
编程语言 时间:
2018-07-22 17:08:22
阅读次数:
171
java.util.concurrent.atomic.AtomicLong类提供了可以被原子地读取和写入的底层long值的操作,并且还包含高级原子操作。 AtomicLong支持基础long类型变量上的原子操作。 它具有获取和设置方法,如在volatile变量上的读取和写入。 也就是说,一个集合与 ...
分类:
其他好文 时间:
2018-06-06 21:42:00
阅读次数:
200
「 天行健,君子以自强不息。地势坤,君子以厚德载物。」———《易经》 volatile 变量,在上一篇文章中已经有简单提及相关概念和用法,这一篇主要对 Volatile 变量的特性进行源码验证。验证它的涉及到的三个特性: 可见性 指令重排序 非原子性 volatile 之可见性验证 上一篇文章中,讲 ...
分类:
编程语言 时间:
2018-06-06 01:13:31
阅读次数:
232
「 天行健,君子以自强不息。地势坤,君子以厚德载物。」———《易经》volatile 变量,在上一篇文章中已经有简单提及相关概念和用法,这一篇主要对 Volatile 变量的特性进行源码验证。验证它的涉及到的三个特性:可见性指令重排序非原子性volatile 之可见性验证上一篇文章中,讲到 volatile 变量通常被当做状态标记使用。其中典型的应用是,检查标记状态,以确定是否退出循环。下面我们直
分类:
编程语言 时间:
2018-05-29 22:50:24
阅读次数:
275
我们已经知道同步代码块和同步方法可以保证以原子的方式执行,其实,同步还有另外一个重要概念:内存可见性。换句话说,我们不仅希望防止某个线程正在使用对象状态而另一个线程同时在修改状态,而且希望确保当一个线程修改了对象的状态后,其他线程能够看到修改后的状态。
分类:
编程语言 时间:
2018-05-26 11:41:18
阅读次数:
217
Volatile的特征: A、禁止指令重排(有例外) B、可见性 Volatile的内存语义: 当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存。 当读一个volatile变量时,JMM会把线程对应的本地内存置为无效,线程接下来将从主内存中读取共享变量。 Vol ...
分类:
编程语言 时间:
2018-05-23 20:44:16
阅读次数:
201
被volatile修饰的变量能够保证每个线程能够获取该变量的最新值,从而避免出现数据脏读的现象。 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此 ...
分类:
编程语言 时间:
2018-05-22 22:17:53
阅读次数:
235