volatile的写锁对应的是锁的锁定
volatile的读锁对应的是锁的释放
Q:为什么volatile的读写与普通的读写要通过内存屏障来保障不能重排序捏?
1:v写之前的操作不能与v写进行重排序
2:v读之后的操作不能与v读进行重排序
3:v写不能与v读进行重排序
volatile的读写锁在内存语义上看就是线程与线程之间的通信。
针对v写的内存语意,v写会将缓存中的数据全部刷到主内存当中去
根据v写的内存语意,我们可以了解到,如果前面变量的操作重排序到v写的后面,那么就极有可能造成主内存中的数据与缓存中的数据无法同步,那么此时有操作在去读取数据时,从主内存中拉取的数据可能就不是最新的数据。
一个变量被volatile修饰后,JVM会为我们做两件事:
1.在每个volatile写操作前插入StoreStore屏障,在写操作后插入StoreLoad屏障。
2.在每个volatile读操作前插入LoadLoad屏障,在读操作后插入LoadStore屏障。
volatile优点是:不需要加锁也能保持线程的可见性,减少上下文之间的切换次数。