gpt4 book ai didi

multithreading - JVM/x86是否保证值在内核之间的非 volatile 传播?

转载 作者:行者123 更新时间:2023-12-03 12:51:45 25 4
gpt4 key购买 nike

假设以下代码:

class X {
private int v = 1;
public void set(int v) { this.v = v; }
public int get() { return v; }
}

是否没有通过将 v标记为volatile的可能性,在调用 set(123)时,其值不会传播到其他内核(即它们的缓存和/或主内存),或者只是时间问题,直到这种情况发生了?

通过四处询问,一般的想法似乎是值“早晚会到达那里”,因此,只要我们不太关心时间准确性,就可以将值保持不变,但是我想正式确定。

我的理解是,由于没有获取/发布语义,因此JMM不能保证它能正常工作,但另一方面,我(有限)对缓存一致性/一致性模型(即TSO-x86)的理解是,它将必须最终传播(将其标记为volatile会简单地设置围栏以禁止对CPU的存储缓冲区进行重新排序,但最终会将其传播到其他缓存)。关于这一点,只有一点让我感到奇怪-如果另一个内核向同一缓存行中的另一个变量写入内容会怎样?在任何情况下都可以覆盖 v吗?

对此事有知识的人可以给我一个更具体的答案吗?

谢谢!

最佳答案

根据JVM的memory model,在您的示例中没有happens-before关系。因此,从形式上来说,没有任何保证可以保证另一个线程永远不会看到共享变量的更新。

对我而言,依靠特定JVM和处理器体系结构的实现细节似乎不是一个好主意。今天在实验室中有效的方法明天可能会在现场失败。另请注意,由于没有上限,最终可能会很长。实际上,我遇到过一些情况,由于缺少volatile批注,我的程序似乎被阻塞,不得不重新启动。

关于multithreading - JVM/x86是否保证值在内核之间的非 volatile 传播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56001665/

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