happens-before的法则

内容来源于《JAVA并发编程实践》

Java存储模型的定义是通过动作(actions)的形式进行描述的。所谓动作,包括变量的读和写、监视器加锁和释放锁、线程的启动和拼接(join)。

JAVA存储模型(JMM)为所有程序内部的动作定义了一个偏序关系,叫做happens-before。要保证执行动作B的线程看到动作A的结果(无论A与B是否发生在同一个线程中),A和B之间就必须满足happens-before关系。如果两个操作之间并未按照happens-before关系排序,JVM可以对他们随意地重排序。

happens-before法则包括:

程序次序法则:线程中的每个动作A都happens-before于该线程中的每一个动作B,其中,在程序中,所有的动作B都出现在动作A之后。

监视器锁法则:对一个监视器锁的解锁happens-before于每一个后续对同一监视锁的加锁。

volatile变量法则:对volatile域的写入操作happens-before于每一个后续对同一域的读操作。

线程启动法则:在一个线程里,对Thread.start的调用会happens-before于每一个启动线程中的动作。

线程终结法则:线程中的任何动作都happens-before于其他线程检测到这个线程已经终结、或者从Thread.join调用中成功返回,或者Thread.isAlive返回false。

中断法则:一个线程调用另一个线程的interrupt,happens-before于被中断的线程发现中断(通过抛出InterrutedException,或者调用isInterrupted和interrupted)

终结法则:一个对象的构造函数的结束happens-before于这个对象finalizer的开始。

传递性:如果happens-before于B,且B happens-before于C,则A happens-before于C

你可能感兴趣的:(java)