重排序是指编译器和处理为了优化程序性能而对指令序列进行重新排序的一种手段。
数据依赖
如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分为下列3中类型。
名称 | 代码示例 | 说明 |
写后读 | a=1;b=a; | 写一个变量之后,再读这个位置 |
写后写 | a=1;a=2; | 写一个变量之后,再写这个变量 |
读后写 | a=b;b=1; | 读一个变量之后,再写这个变量 |
as-if-serial语义
as-if-serial语义的意思是:不管怎么重排序程序的执行结果不能被改变。编译器、runtime和处理器必须都遵守as-if-serial语义。如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重新排序。下面是计算圆面积的示例。double pi = 3.14; //A double r = 1.0; //B double area = pi * r; //CA和C之间存在数据依赖关系,同时B和C之间也存在数据依赖关系。因此C不能排在A和B的前面,但A和B没有依赖关系,编译器就可以重新排序A和B之间的执行顺序。
程序顺序规则
根据happens-before的程序顺序规则,上面计算圆面积的代码存在3个happens-before关系。1) A happens-before B
2) B happens-before C
3) A happens-before C
重排序对多线程的影响
重排序是否会改变多线程程序的执行结果。class ReorderExample{ int a = 0; boolean flag = false; public void writer(){ a = 1; //1 flag = true; //2 } public void reader(){ if(flag){ //3 int i= a*a;//4 ... } } }flag变量是个标记,用来标识变量a是否已被写入。这里假设有两个线程A和B,A首先执行writer()方法,随后B线程执行reader()方法。线程B在执行操作4时,能否看到线程A在操作1对共享变量a的写入吗?
不一定能看到。
由于操作1和操作2没有数据依赖关系,编译器和处理器可以对这两个操作重排序,同样3和4没有数据依赖关系,编译器也可以对这两个操作重排序。
操作1和操作2做了重排序,线程A首先标记变量flag,随后B线程读取这个变量,由于条件为true,线程B读取变量a,此时变量a还没有写入,这里多线程程序的语义被破坏了。
操作3和操作4存在控制依赖关系。代码存在控制依赖关系时,会影响指令程序的并行度。
感谢并发编程网ticmy提供的中文版:
http://www.ticmy.com/?p=315
http://ifeve.com/wp-content/uploads/2014/03/JSR133%E4%B8%AD%E6%96%87%E7%89%881.pdf
http://www.ticmy.com/?p=315
http://ifeve.com/wp-content/uploads/2014/03/JSR133%E4%B8%AD%E6%96%87%E7%89%881.pdf
相关推荐
Java ip 地址排序Java ip 地址排序Java ip 地址排序Java ip 地址排序
NULL 博文链接:https://zhaodengfeng1989.iteye.com/blog/2419692
java实现中文排序,按数字字母汉字的顺序进行排序
java 选择排序法 java 选择排序法 java 选择排序法
java冒泡排序代码,亲测能用,控制台输入数据,自动排序
Java基础知识: 冒泡排序详解,简单而详细的讲清楚了,什么是冒泡排序。 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如...
JAVA排序汇总JAVA排序汇总JAVA排序汇总
java数组排序的思想,过程和代码实现。多种数组排序的方法,主要有冒泡排序,堆排序,插入排序, 归并操作(merge), 归并操作(merge),选择排序,希尔排序。
java 冒泡排序方法,java 冒泡排序方法。
java 各种排序排序.pdf
Java三种排序 Java三种排序 Java三种排序
java 冒泡排序法 PPT文档java 冒泡排序法 PPT文档java 冒泡排序法 PPT文档java 冒泡排序法 PPT文档
java 中文姓氏 排序
java排序.txt
Java所有排序算法大全 Java所有排序算法大全 Java所有排序算法大全 Java所有排序算法大全
java中数组的自定义排序,种类繁多,简单实现,可自由操控。
java排序 java 排序 排序大全 算法 java算法
JAVA冒泡排序和快速排序算法,符合实验报告要求哦
Java 集合排序及java 集合类详解 Java 集合排序及java 集合类详解,Java里面最重要、最常用也就是集合那部分了,能够用好集合和理解好集合对于做Java程序的开发拥有无比的好处。本教程详细解释了关于Java中的集合是...
软件工程、快速排序法。绝顶的好东西。快速排序.Java快速排序.Java快速排序.Java