gpt4 book ai didi

java - 在 Java 内存模型中发生在关系之前

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:46 24 4
gpt4 key购买 nike

我有一个关于 Java 内存模型的问题。

在以下场景中:首字母:a = 0; b = 0;

T1:
a = 1;
l.lock();
b = 1;
l.unlock();

T2:
l.lock();
read b;
l.unlock();
read a;

我可以说如果 b 的值吗?由 T2 阅读是1 , 那么 a 的值由 T2 阅读必须是 1

据我了解,unlockT1刷新 a 的值和 b到主内存,和lockT2确保 read aread b可以获得最新的值。

我说得对吗?

编辑:我只是指定它们被锁定在同一把锁上。

最佳答案

Can I say if the value of b read by T2 is 1, then the value of a read by T2 must be 1?

是的。这是有保证的。操作可以移入同步块(synchronized block),但不能移出。请参阅 Jeremy Mansons 博客文章 Roach Motels and The Java Memory Model .

这意味着,虽然 read a可以在unlock之前向上移动, (由于指令重新排序而高于 read b)它永远不能高于 lock T2的说明.

同样的推理适用于 a = 1 : 它可以向下移动到同步块(synchronized block)(由于指令重新排序而低于 b = 1)但没有通过 unlock说明。

但是,如果我们像那样交换指令,它们都会被锁覆盖,这意味着如果 T2读取 1来自 b , 然后 T1已经写了一个1b .

关于java - 在 Java 内存模型中发生在关系之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26811382/

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