volatile
理解volatile特性的一个好方法:
把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步
锁的happens-before规则保证释放锁和获取锁的两个线程之间的内存可见性,
这意味这对一个volatile变量的读,总是能看到任意线程对这个volatile变量最后的写入值
锁的语义决定了临界区代码的执行具有原子性
如果是多个volatile操作或类似于volatile++这种复合操作,这些操作整体上不具有原子性
从JSR-133开始,volatile变量的写-读可以实现线程之间的通信
从内存语义的角度来看:
1.volatile的写-读与锁的释放-获取有相同的内存效果
2. volatile写和锁的释放有相同的内存语义
3. volatile读与锁的获取有相同的内存语义
锁释放和获取的内存语义
当线程释放锁的时候,JMM会把线程对应的本地内存中的共享变量刷新到主内存中
当线程获取锁时,JMM会把线程对应的本地内存置为无效,
从而使得被监视器保护的临界区代码必须要从主内存中去读取共享变量
volatile写-读的内存语义
当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存
当读一个volatile变量时,JMM会把线程对应的本地内存置为无效,线程接下来将从主内存中读取共享变量