gpt4 book ai didi

java - 使用 volatile 关键字时出现内存一致性错误的示例?

转载 作者:IT王子 更新时间:2023-10-28 23:35:25 25 4
gpt4 key购买 nike

来自文档:

Using volatile variables reduces the risk of memory consistency errors

但这意味着有时 volatile 变量不能正常工作?奇怪的是如何使用它 - 在我看来,这是非常糟糕的代码,有时工作有时不工作。我尝试谷歌,但没有找到 volatile 的示例内存一致性错误。你能推荐一个吗?

最佳答案

问题不在于 volatile 工作不可靠。它总是按应有的方式工作。问题是它应该工作的方式有时不足以进行并发控制。如果在错误的情况下使用 volatile,仍然会出现内存一致性错误。

volatile 变量将始终将任何写入传播到所有线程。但是,假设您需要在各个线程之间增加变量。这样做(*):

volatile int mCounter;

// later, in some code that might be executed simultaneously on multiple threads:
mCounter++;

有可能会错过计数器增量。这是因为 mCounter 的值需要先由每个线程读取,然后才能写入新值。在这两个步骤之间,另一个线程可能更改了 mCounter 的值。在这种情况下,您需要依靠 synchronized block 而不是 volatile 来确保数据完整性。

有关 volatilesynchronized 的更多信息,我推荐文章 Managing volatility布赖恩·戈茨(Brian Goetz)

(*) 我意识到使用 AtomicInteger 会更好地实现上述内容;这是一个人为的例子来说明一个观点。

关于java - 使用 volatile 关键字时出现内存一致性错误的示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13598359/

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