【Java】一文读懂happens-before原则

通常,当我们写代码时,我们会假设代码是按照编写的顺序执行的。但事实并非如此,因为出于优化目的,语句的重新排序可能会在编译时或运行时发生。

无论线程何时运行程序,结果都应该像是所有操作都按照它们在程序中出现的顺序发生一样。单线程程序的执行应遵循“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 保证。

规则

我们可以查看文档了解这些规则。

  1. 监视器上的解锁操作 happens-before 每个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值