并发 二月 15, 2020

并发编程之Happens-Before原则

文章字数 1.6k 阅读约需 1 mins. 阅读次数 12530

Happens-Before原则

JVM定义的Happens-Before原则是一组偏序关系:对于两个操作A和B,这两个操作可以在不同的线程中执行。如果A Happens-Before B,那么可以保证,当A操作执行完后,A操作的执行结果对B操作是可见的。
Happens-Before的规则包括:

  • 程序顺序规则
  • 锁定规则
  • volatile变量规则
  • 线程启动规则
  • 线程结束规则
  • 中断规则
  • 终结器规则
  • 传递性规则

程序顺序规则

在一个线程内部,按照程序代码的书写顺序,书写在前面的代码操作Happens-Before书写在后面的代码操作。这时因为Java语言规范要求JVM在单个线程内部要维护类似严格串行的语义,如果多个操作之间有先后依赖关系,则不允许对这些操作进行重排序。

锁定规则

对锁M解锁之前的所有操作Happens-Before对锁M加锁之后的所有操作。

volatile变量规则

对一个volatile变量的写操作及这个写操作之前的所有操作Happens-Before对这个变量的读操作及这个读操作之后的所有操作。

线程启动规则

Thread对象的start方法及书写在start方法前面的代码操作Happens-Before此线程的每一个动作。

线程终止规则

线程中的任何操作都Happens-Before其它线程检测到该线程已经结束。

中断规则

一个线程在另一个线程上调用interrupt,Happens-Before被中断线程检测到interrupt被调用。

终结器规则

一个对象的构造函数执行结束Happens-Before它的finalize()方法的开始。

传递性规则

如果操作A Happens-Before B,B Happens-Before C,那么可以得出操作A Happens-Before C。

0%