JMM——volatile的内存语义
2016-03-30 10:01
260 查看
volatile
理解volatile特性的一个好方法:
把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步
锁的happens-before规则保证释放锁和获取锁的两个线程之间的内存可见性,
这意味这对一个volatile变量的读,总是能看到任意线程对这个volatile变量最后的写入值
锁的语义决定了临界区代码的执行具有原子性
如果是多个volatile操作或类似于volatile++这种复合操作,这些操作整体上不具有原子性
从JSR-133开始,volatile变量的写-读可以实现线程之间的通信
从内存语义的角度来看:
1.volatile的写-读与锁的释放-获取有相同的内存效果
2. volatile写和锁的释放有相同的内存语义
3. volatile读与锁的获取有相同的内存语义
当线程获取锁时,JMM会把线程对应的本地内存置为无效,
从而使得被监视器保护的临界区代码必须要从主内存中去读取共享变量
当读一个volatile变量时,JMM会把线程对应的本地内存置为无效,线程接下来将从主内存中读取共享变量
理解volatile特性的一个好方法:
把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步
锁的happens-before规则保证释放锁和获取锁的两个线程之间的内存可见性,
这意味这对一个volatile变量的读,总是能看到任意线程对这个volatile变量最后的写入值
锁的语义决定了临界区代码的执行具有原子性
如果是多个volatile操作或类似于volatile++这种复合操作,这些操作整体上不具有原子性
从JSR-133开始,volatile变量的写-读可以实现线程之间的通信
从内存语义的角度来看:
1.volatile的写-读与锁的释放-获取有相同的内存效果
2. volatile写和锁的释放有相同的内存语义
3. volatile读与锁的获取有相同的内存语义
锁释放和获取的内存语义
当线程释放锁的时候,JMM会把线程对应的本地内存中的共享变量刷新到主内存中当线程获取锁时,JMM会把线程对应的本地内存置为无效,
从而使得被监视器保护的临界区代码必须要从主内存中去读取共享变量
volatile写-读的内存语义
当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存当读一个volatile变量时,JMM会把线程对应的本地内存置为无效,线程接下来将从主内存中读取共享变量
相关文章推荐
- C中的volatile使用方法
- 探讨C语言中关键字volatile的含义
- 学习Java多线程之volatile域
- C语言中auto,register,static,const,volatile的区别详细解析
- C语言中const,volatile,restrict的用法总结
- C语言 volatile与const同时使用应注意的问题
- 深入解析Java中volatile关键字的作用
- 解析java中volatile关键字
- 深度解析Java中volatile的内存语义实现以及运用场景
- JAVA中JVM的重排序详细介绍
- 详解Java线程编程中的volatile关键字的作用
- 深入探讨Java多线程中的volatile变量
- 深入讲解C语言编程中volatile修饰符的作用
- 大话JMM
- Java理论与实践:正确使用volatile 变量
- 一个由JIT优化引发的问题
- Const Volatile 关键词解析
- const与volatile的使用方法
- volatile的作用
- volatile, 用更低的代价替代同步