Volatile 变量

195 阅读2分钟

一.Volatile原理

  • java语言提供了一种稍弱的进程同步机制,即Volatile变量。当把一个变量声明为Volatile后,这个变量在编译和运行时都是共享的。因此不会将该变量与其他内存操作一起重排序,在读取Volatile变量时总会返回最新写入的值。

二.访问Volatile变量

  • 在访问Volatile变量时不会执行加锁操作,因此不会造成线程阻塞,所以他是一种比sychronized更加轻量级的线程同步机制
  • JVM保证了每次读取Volatile变量都从内存中直接读取,跳过了CPU cache这一步

三.Volatile变量的两种特性

  • 保证此变量对所有的线程的可见性,这里的“可见性”,如本文开头所述,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。但普通变量做不到这点,普通变量的值在线程间传递均需要通过主内存(详见:Java内存模型)来完成。
  • 禁止指令重排序优化。有volatile修饰的变量,赋值后多执行了一个“load addl $0x0, (%esp)”操作,这个操作相当于一个内存屏障(指令重排序时不能把后面的指令重排序到内存屏障之前的位置),只有一个CPU访问内存时,并不需要内存屏障;(什么是指令重排序:是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理)。

四.volatile 性能:

  • volatile 的读性能消耗与普通变量几乎相同,但是写操作稍慢,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。