volatile的内存语义 锁的内存语义

一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读有相同的内存语义

三锁内存语义的实现 

锁内存语义的实现方式有两种:

  1. 利用volatile变量的写-读所具有的内存语义
  2. 利用CAS所附带的volatile读和volatile写的内存语义

reentrantlock分为公平锁和非公平锁,公平锁和非公平锁释放时,最后都要写一个volatile变量state,公平锁获取时,首先会去读volatile变量,非公平锁获取时,首席前会用CAS更新volatile变量,这个操作同时具有volatile读和volatile写的内存语义

猜你喜欢

转载自blog.csdn.net/wo8vqj68/article/details/82964290