通常,当我们写代码时,我们会假设代码是按照编写的顺序执行的。但事实并非如此,因为出于优化目的,语句的重新排序可能会在编译时或运行时发生。
无论线程何时运行程序,结果都应该像是所有操作都按照它们在程序中出现的顺序发生一样。单线程程序的执行应遵循“as-if-serial”语义。只要保证结果与程序按顺序执行时的结果相同,优化和重新排序是可以被引入的。
让我们看一个例子。
这个代码块:
var i = 0;
var j = 1;
j--;
可以被重新排序为:
var j = 1;
j--;
var i = 0;
我们可以根据前面代码块的结果添加额外的分配:
var x = i+j;
无论发生了怎样的重新排序,结果都应该像是程序的每个语句按顺序执行一样。
从单线程的角度来看,这是没问题的;然而,当多个线程在这样的代码块上操作时,就会出现各种问题。一个线程的操作效果不会以可预测的方式对其他线程可见。
想象一下,一个线程的代码块执行依赖于另一个线程的执行结果。这就是所谓的“happens-before”关系。我们有两个事件,无论重新排序如何,结果都应该像是一个事件发生在另一个事件之前。
Java 提供了 happens-before 保证。
规则
我们可以查看文档了解这些规则。
- 监视器上的解锁操作 happens-before 每个

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



