Fork me on GitHub

Java Volatile Keyword

volatile关键字被用来表示数据的读取和写入直接与主存交互,不会经过cpu缓存器。
1. 使用场景:当有多个线程读一个线程读写时,使用volatile关键字修饰变量,这样可以保证数据的对多个线程的可见性,保证每个线程读取到的数据都是正确的。
2. 证明:如果变量不使用volatile修饰,数据就会经过cpu缓存器,一个线程首先是将数据读取到cpu缓存器中再与cpu进行交互,当线程修改变量数据后不能保证数据马上更新到主存中,其他的线程去读取数据时就会读取到旧的数据。
3. 不能满足的场景:当有多个线程(2个以上)读写时,使用volatile关键字修饰是不够的,这不能保证数据每次被读取到的都是正确的。由于多个线程同时读取数据后需要依赖变量当前的值来修改值,这时就会产生竞态条件,每个线程同时读取到值为0,都在这个基础上加1,最后得到的值却为2,因为volatile关键字并不能保证操作的原子性,为了解决这个问题需要使用synchronizedlocks类或者支持原子操作的AtomLong类。
volatile关键字可以阻止指令重排,例如在由volatile修饰的变量之前进行对其他普通变量的操作,这会保证其他普通变量数据及时的更新到主存。
4. 性能问题:由于volatile关键字修饰变量数据变化导致直接与主存交互,没有经过cpu缓存器,这必然使得读取写入数据变慢,还有volatile关键字阻止了jvm的指令重排优化代码功能,这也降低了性能,所以只在符合场景的时候使用volatile关键字修饰。

参考文献:

http://tutorials.jenkov.com/java-concurrency/volatile.html


最新评论

    还没有人评论...

当当

友情链接

Powered by Python. Copyright © 2017.

鄂ICP备17010875号. All rights reserved.