java happens before_Java 规范里对happens-before的解释该如何理解?

这个例子应该是说,这里的两种情况,都是满足happens-before consistency的,但是不满足sequential consistency的。

你往前面看看17.4. Memory Model,有这个前提,应该好理解一点。

Example 17.4.5-1 第一个例子应该是说明,在两个线程没有同步保障的情况下,对共享变量B和A的read,是没有happens-before保证的,谁都可以read到对方write之前的value。

Example 17.4.5-1 第二个例子应该是说明,在两个线程没有同步保障的情况下,任何一方,也都可能read到对方write之后的value。只不过,这里还发生了redordering(可能是编译器优化,在Memory Model中提到了)。

这里的两个例子,都是给出了看起来不合理,但是在多线程中,并不违反Happens-before的情况(或者说,这里也根本没有任何Happens-before保证)。

而如果有同步,这两种情况,应该都不会发生。

PS:Memory Model说明了非常关键的一点,“To determine if the actions of threadtin an execution are legal, we simply evaluate the implementation of threadtas it would be performed in a single-threaded context”

结合上下文,应该理解为:所谓“(一段代码)合法的执行(结果)”,是指假设这段代码在单线程执行的情况下,“结果一致”,就是符合specification要求的,至于中间的,对执行顺序进行调整、优化,都是允许各种虚拟机实现自行决定的。这一点,也说明了specification中搞这么复杂的关键原因,就是为了“允许优化执行代码”。

在17.4.3. Programs and Program Order 的最后一句,说的非常明白:“If we were to use sequential consistency as our memory model, many of the compiler and processor optimizations that we have discussed would be illegal.”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值