happens-before规则
我们编写的程序都要经过优化后(编译器和处理器会对我们的程序进行优化以提高运行效率)才会被运行,优化分为很多种,其中有一种优化叫做重排序,重排序需要遵守happens-before规则。
happens-before部分规则如下:
1、程序顺序规则:一个线程中的每个操作happens-before于该线程中的任意后续操作
2、监视器锁(同步)规则:对于一个监视器的解锁,happens-before于随后对这个监视器的加锁
举例说明
public double rectangleArea(double length , double width){
double leng;
double wid;
leng=length; //A
wid=width; //B
double area=leng*wid; //C
return area;
}
这是一个计算长方形面积的代码,其中有三句被我们标记为ABC,上面的操作在运行之前编译器和处理器可能会进行优化
在程序中
A happens-before B
B happens-before C
A happens-before C
happens-before具有传递规则
根据happens-before规则我们来分析重排序后可能产生的结果
因为A happens-before B,所以A操作产生的结果leng一定要对B操作可见,但是现在B操作并没有用到length,所以这两个操作可以重排序,那A操作是否可以和C操作重排序呢,如果A操作和C操作进行了重排序,因为leng没有被赋值,所以leng=0,area=0*wid也就是area=0;这个结果显然是错误的,所以A操作是不能和C操作进行重排序的。