happen-before原则

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Michaeles/article/details/86634493

1.什么是happen-before

(1)编写的程序都要经过优化(编译器和处理器会对程序进行优化)后才会被运行,优化分为很多种,其中有一种优化叫做重排序,重排序需要遵守happens-before规则。

(2)a happens-before b :happens-before关系保证a操作将对b操作可见。

2.happen-before原则(前一个操作的执行结果必须对后一个操作可见)

一个线程中的每一个操作happens-before于该线程的任意后续操作,这里的happens-before并不是前一个操作必须早于后一个操作, 而是前一个操作必须对后一个操作可见,否则不能重排序。

3.具体规则

(1)程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。
(2)监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。
(3)volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。
(4)传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。
(5)start()规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。
(6)Join()规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。
(7)程序中断规则:对线程interrupted()方法的调用先行于被中断线程的代码检测到中断时间的发生。
(8)对象finalize规则:一个对象的初始化完成(构造函数执行结束)先行于发生它的finalize()方法的开始。


4.举例(即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;
	}

上面的操作在运行之前编译器和处理器可能会进行优化,在程序中

A  happens-before  B

B  happens-before C

A  happens-before C //happens-before具有传递规则

(1)因为A  happens-before  B,所以A操作产生的结果leng一定要对B操作可见,但是现在B操作并没有用到length,所以这两个操作可以重排序;

(2)如果A操作和C操作进行了重排序,因为leng没有被赋值,所以leng=0,area=0*wid也就是area=0,A和C不能进行重排序;

展开阅读全文

没有更多推荐了,返回首页