gpt4 book ai didi

java - Java 中多次写入对 volatile 变量的影响

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:14 26 4
gpt4 key购买 nike

我在这个网站上发现了一些有趣的问题(例如,this one)关于 Java 中 volatile 变量的可见性影响,这些问题源自本书 Java concurrency in Practice 中的这段话:

The visibility effects of volatile variables extend beyond the value of the volatile variable itself. When thread A writes to a volatile variable and subsequently thread B reads that same variable, the values of all variables that were visible to A prior to writing to the volatile variable become visible to B after reading the volatile variable. So from a memory visibility perspective, writing a volatile variable is like exiting a synchronized block and reading a volatile variable is like entering a synchronized block.

然而,即使在阅读了本网站相关问题的答案后,我仍然不完全清楚一个场景,具体来说:

线程 A0 线程 A 之前写入相同的 volatile 变量会产生什么影响?换句话说:A0 写入 volatile 变量,该值稍后被 A 覆盖(不读取变量),然后由B。 (所以我们有两个来自不同线程(A0A)的写操作和一个来自第三个线程(B)的读操作)。

我可以安全地假设 AB 都可以看到 A0 可见的一切A0 写入 volatile 变量之前?

更新:

这是一道关于Java内存模型的概念题。我知道我无法预测在线程 A0A 中写入 volatile 变量以及在线程 B 中读取的顺序。不过,为了方便讨论,还是说A0A 开始之前启动了很多时间,并且在另一个显着时间之后 B 开始了,让我们做一个简化的假设,这是足以保证写入和读取按照描述的顺序发生(我知道顺序不能仅通过时间来保证,这只是为了避免与原始问题偏离的简化)。

最佳答案

Can I safely assume that both A and B are guaranteed to see everything that was visible to A0 before A0 wrote to the volatile variable?

写入 volatile 不会为线程提供任何关于读取的先行发生保证。

B 读取时,它将看到 A0 可以看到的任何内容,前提是它看到了它所做的更新。 B 也可以看到任何 A 可以看到的东西,只要它看到 A 写的值。否则,如果 B 读取的值不是来自那个线程,它可能会看到比任一线程更早的状态,即它太早了。

如果 A0 尝试先写入,它可能会在 A 之后完成,例如假设 A 与数据的干净副本位于同一套接字上。它可以在 A0 之前访问它,因为后者需要更长的时间来获取缓存行。最后完成的那个决定了数据的最终状态。

关于java - Java 中多次写入对 volatile 变量的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28139651/

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