gpt4 book ai didi

java - 我是否正确理解了 JSR-133 Cookbook 中的 Can Reorder 规则?

转载 作者:行者123 更新时间:2023-11-29 08:30:39 28 4
gpt4 key购买 nike

在此链接中http://gee.cs.oswego.edu/dl/jmm/cookbook.html , 有这张表说明什么可以重新排序,什么不能。

这是图片

enter image description here

现在看看 http://tutorials.jenkov.com/java-concurrency/volatile.html 中的这句话

“之前和之后的指令可以重新排序,但是volatile read或write不能与这些指令混合。”

例如说我有代码

int x = 5; 
int z = 2; // storing 2 into z
z = someVolatileIntNotTwo; // storing some volatile int that != 2 into z
int a = 6;
System.out.println(z);

根据表告诉我的内容,它表示可以重新排序普通存储和 volatile 负载,这意味着

int z = 2; // storing 2 into z
z = someVolatileIntNotTwo; // storing some volatile int that != 2 into z

可以重新排序为

z = someVolatileIntNotTwo; // storing some volatile int that != 2 into z
int z = 2; // storing 2 into z

这可能意味着程序将在重新排序的情况下打印除 2 之外的其他内容。

这背后的原因是,首先 z = 2 进行普通存储,然后 z = someVolatileIntNotTwo 进行 volatile 加载,然后进行普通存储。虽然无法重新排序后跟正常存储的 volatile 加载是真的,但在这种情况下,这不会发生,因为如果重新排序,我们仍然会得到这个序列。

z = someVolatileIntNotTwo; // volatile Load then normal Store. 
int z = 2; // normal load

除了正常加载(int z = 2)和[volatile load and normal store](z = someVolatileIntNotTwo)被重新排序之外,没有任何情况下第一个操作被第二个操作重新排序,根据表是好的

但是,jenkov 教程说这是不可能的。那么,谁是对的?

最佳答案

您对重新排序范围的解释过于宽泛。来自 JSR-133 Cookbook:

even though the table doesn't say so, you can't reorder a load with a subsequent store to the same location.

更直接地回答您的问题:两篇文章都不正确。您的 sample 中的重新排序是非法的。

关于java - 我是否正确理解了 JSR-133 Cookbook 中的 Can Reorder 规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48534643/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com