Java多线程系列-happens-before规则和as-if-serial语义
2017-10-26 21:03
645 查看
JSR-133使用happens-before的概念来阐述操作之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见,
那么这2个操作之间必须要存在happens-before关系。这里提到的2个操作既可以是一个线程之内,也可以是不同线程之间。
与程序员密切相关的happens-before规则如下:
1、程序顺序规则:一个线程中的每个操作,happens-before于线程中的任意后续操作。
2、监视器锁规则:一个锁的解锁,happens-before于随后对这个锁的加锁。
3、volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。
4、传递性:如果A happens-before B,且Bhappens-before C,那么Ahappens-before C。
需要注意的是:
两个操作之间具有happens-before关系,并不意味着前一个操作必须要在后一个操作之前执行!
happens-before仅仅要求前一个操作(执行的结果)对后一个操作可见,且前一个操作按顺序排在第
二个操作之前。
一个happens-before规则对应一个或多个编译器和处理器重排序规则。对于Java程序员来说,
happens-before规则简单易懂,它避免Java程序员为了理解JMM提供的内存可见性保证而去
学习复杂的重排序以及这些规则的具体实现方法。
as-if-serial语义
as-if-serial语义的意思是:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不会改变。
编译器、runtime和处理器都必须遵守as-if-serial语义。
为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。
但是,如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序。
那么这2个操作之间必须要存在happens-before关系。这里提到的2个操作既可以是一个线程之内,也可以是不同线程之间。
与程序员密切相关的happens-before规则如下:
1、程序顺序规则:一个线程中的每个操作,happens-before于线程中的任意后续操作。
2、监视器锁规则:一个锁的解锁,happens-before于随后对这个锁的加锁。
3、volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。
4、传递性:如果A happens-before B,且Bhappens-before C,那么Ahappens-before C。
需要注意的是:
两个操作之间具有happens-before关系,并不意味着前一个操作必须要在后一个操作之前执行!
happens-before仅仅要求前一个操作(执行的结果)对后一个操作可见,且前一个操作按顺序排在第
二个操作之前。
一个happens-before规则对应一个或多个编译器和处理器重排序规则。对于Java程序员来说,
happens-before规则简单易懂,它避免Java程序员为了理解JMM提供的内存可见性保证而去
学习复杂的重排序以及这些规则的具体实现方法。
as-if-serial语义
as-if-serial语义的意思是:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不会改变。
编译器、runtime和处理器都必须遵守as-if-serial语义。
为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。
但是,如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序。
相关文章推荐
- happens-before规则和as-if-serial语义
- Java多线程--As-if-sreial语义
- Java 多线程之happens-before规则解释
- Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)
- Java多线程--happens-before
- Java的多线程机制系列:(四)不得不提的volatile及指令重排序(happen-before)
- java-多线程深入(三)happens-before介绍
- Java的多线程机制系列:不得不提的volatile及指令重排序(happen-before)
- 多线程 happens-before规则
- java中几个happens-before规则
- 【java多线程系列】java中的volatile的内存语义
- Java多线程 -- 深入理解JMM(Java内存模型) -- happens-before俗解
- 【java多线程系列】java中的volatile的内存语义
- 【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)
- Java的多线程机制系列:(二)缓存一致性和CAS
- 【java多线程系列】java内存模型与指令重排序
- Java多线程系列--“基础篇”01之 基本概念
- java多线程系列(二)---对象变量并发访问
- Java多线程-线程池ThreadPoolExecutor构造方法和规则
- Java多线程系列--“JUC集合”10之 ConcurrentLinkedQueue