1 - volatile特性

image.png

image.png

volatile变量有两个特性:

  1. 可见性:对一个volatile变量的读,总是能看到任意线程对这个变量的写入的最新的值。也就是说读的时候总是读到最新的值。
  2. 原子性:对单个volatile变量的读和写是原子的,但对于i++这样的复合操作没有原子性

2 - 写-读的happens-before关系

对volatile变量的读写,能实现线程之间的通信。从内存语义的角度,

  1. volatile的写-读和锁的释放-获取有相同的内存效果
  2. volatile的写,和锁的释放有相同的内存语义
  3. volatile的读,和锁的加锁有相同的内存语义

3 - 写-读的内存语义

volatile写的内存语义:当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量(注意,不只是volatile变量的值,是当前线程本地内存中的所有值。)刷新到主内存。意味着volatile写变量之前,普通变量的写都会刷新到主内存,从而对其他处理器可见。

volatile读的内存语义:JMM会把该线程对应的本地内存置为无效。该线程接下来要从主内存中读取变量的值。

4 - 内存语义实现

插入相应的屏障