happen-before 规则

Posted xmsx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了happen-before 规则相关的知识,希望对你有一定的参考价值。

目录

由来

Java 内存模型的设计需要考虑两个关键点:

  • 编译器和处理器:希望内存模型对于它们的束缚越少越好,从而做尽可能多的优化来提高性能。
  • 程序员:希望内存模型易于理解。

两者相互矛盾,因此选取一个平衡点:在为程序员提供足够强内存可见性保证的基础上,对编译器和处理器的限制要尽量放宽松。

happen-before 规则不仅为程序员提供足够强内存可见性保证,而且容易理解,让程序员不需要学习重排序就可以进行多线程编程。

内容

  • 程序顺序规则:一个线程中的每个操作,happen-before 于该线程中的任意后续操作。
  • 锁规则:对一个锁的解锁操作,happen-before 于对随后这个锁的加锁操作。
  • volatile 变量规则:对于一个 volatile 域的写,happen-before 于后续对这个 volatile 域的读。
  • 传递性:如果 A heppen-before B,B heppen-before C,那么 A heppen-before C。
  • 线程启动规则:线程对象的 start 方法 heppen-before 于该线程内的任意操作。
  • 线程结束规则:线程中的任何操作一定 heppen-before 于其他线程检测到该线程结束。
  • 线程中断规则:线程的 interrupt 方法 happen-before 于被中断线程的代码检测到中断事件的发生。
  • 对象终结规则:一个对象的初始化完成 happen-before 于 finalize 方法的开始。

程序顺序规则与《单线程程序语义》一样。

A happen-before B,要求操作 A 的执行结果对操作 B 可见,且在程序顺序上操作 A 排在操作 B 前面。

Java 内存模型让程序员认为在执行顺序上操作 A 同样排在操作 B 前面,无需担心重排序的影响。

但是实际上只要《重排序》不影响程序的执行结果,也是允许的,这就是上文所说的平衡点。

以上是关于happen-before 规则的主要内容,如果未能解决你的问题,请参考以下文章

java并发编程(十六)happen-before规则

happen-before原则的理解

用happen-before规则重新审视DCL(转)

Java 使用 happen-before 规则实现共享变量的同步操作

转:Java并发编程之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)

happen-before原则