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 规则实现共享变量的同步操作