1、可见性和禁止重排序

在java代码中,volatile关键字有两个作用:

  • 不同线程对volatile变量的值具有内存可见性
  • 禁止指令重排序

如果共享变量使用volatile修饰,那么在汇编指令中,操作变量语句会多一个lock前缀,该lock前缀指令有三个功能:
1、将当前CPU缓存行的数据立即写回系统内存
2、lock前缀指令会引起在其它CPU中缓存了该内存地址的数据无效
写回操作要经过总线传播,每个CPU通过嗅探在总线的传播数据来检查自己缓存的值是否过期,当CPU发现自己缓存行对应内存地址被修改时,就会将当前CPU的缓存行设置为无效状态
3、lock前缀指令禁止指令重排序
作为内存屏障使用

2、volatile不具备原子性

对于复合操作,volatile变量无法保证原子性,如果要保证复合操作的原子性,就需要使用锁。并且在高并发模式下,volatile变量一定要和java显示锁结合使用。