1 - volatile特性
volatile变量有两个特性:
- 可见性:对一个volatile变量的读,总是能看到任意线程对这个变量的写入的最新的值。也就是说读的时候总是读到最新的值。
- 原子性:对单个volatile变量的读和写是原子的,但对于i++这样的复合操作没有原子性
2 - 写-读的happens-before关系
对volatile变量的读写,能实现线程之间的通信。从内存语义的角度,
- volatile的写-读和锁的释放-获取有相同的内存效果
- volatile的写,和锁的释放有相同的内存语义
- volatile的读,和锁的加锁有相同的内存语义
3 - 写-读的内存语义
volatile写的内存语义:当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量(注意,不只是volatile变量的值,是当前线程本地内存中的所有值。)刷新到主内存。意味着volatile写变量之前,普通变量的写都会刷新到主内存,从而对其他处理器可见。
volatile读的内存语义:JMM会把该线程对应的本地内存置为无效。该线程接下来要从主内存中读取变量的值。
4 - 内存语义实现
插入相应的屏障