码迷,mamicode.com
首页 > 移动开发 > 详细

happen-before 规则

时间:2018-09-28 01:41:53      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:操作   可见性   html   提高   for   vol   blog   final   设计   

目录

由来

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 规则

标签:操作   可见性   html   提高   for   vol   blog   final   设计   

原文地址:https://www.cnblogs.com/xmsx/p/9715061.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!