happen-before 规则

少年恃险若平地,独倚长剑凌清秋。这篇文章主要讲述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 规则】但是实际上只要《重排序》不影响程序的执行结果,也是允许的,这就是上文所说的平衡点。

    推荐阅读