一volatile的特性
可见性:对一个volatile变量的读,总是能看到对这个volatile变量最后的写入
原子性:对任意单个volatile变量的读写具有原子性,但类似于volatile++这种复合操作不具有原子性
二volatile写读建立的happens-before关系
从内存语义的角度来说,volatile的写-读与锁的释放-获取有相同的内存效果:volatile写与锁的释放有相同的内存语义,volatile读与锁的获取有相同的内存语义
三volatile写-读的内存语义
volatile写的内存语义:当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值刷新到主内存中
volatile读的内存语义:当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效,线程接下来将从主内存中读取共享变量
四volatile内存语义的实现
为了实现volatile内存语义,JMM会分别限制这两种类型的重排序类型
对于x86处理器仅对写-读操作做重排序,JMM仅需在volatile写后面插入一个StoreLoad屏障即可实现volatile写-读的内存语义
一锁的释放-获取建立的happens-before关系
根据程序次序规则:1happens-before2,2happens-before3,4happens-before5,5happens-before6
根据监视器锁规则:3happens-before4
根据happens-before的传递性:2happens-before5
二锁的释放和获取的内存语义
当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中
当线程获取锁时,JMM会把该线程对应的本地内存置为无效
锁释放与volatile写有相同的内存语义,锁获取与volatile读有相同的内存语义
三锁内存语义的实现
锁内存语义的实现方式有两种:
- 利用volatile变量的写-读所具有的内存语义
- 利用CAS所附带的volatile读和volatile写的内存语义
reentrantlock分为公平锁和非公平锁,公平锁和非公平锁释放时,最后都要写一个volatile变量state,公平锁获取时,首先会去读volatile变量,非公平锁获取时,首席前会用CAS更新volatile变量,这个操作同时具有volatile读和volatile写的内存语义