gpt4 book ai didi

java - JMM 在实践中

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

考虑以下用 Java 编写的多线程代码:

共享变量:

         boolean n; // non-volatile
volatile boolean v; // volatile

线程 1:

v = true;
System.out.println("n=" + n);

线程 2:

n = true;
System.out.println("v=" + v);

假设最初n = v = false

现在:

  • v=false 的输出是否意味着 n=true 的输出?
  • 如果 n 是可变的,会发生什么变化?
  • 如果 njava.util.List 会发生什么变化(以便 n = true 变为 n.add("something") 并且输出 n=true 转换为 ["something"])?
  • UPD3:如果 vAtomicBoolean 并且对它的所有读取和写入都是使用 compareAndSet 执行的语义?

您能根据 Java 内存模型论证您的立场吗?

UPD:请将 System.out.println("n="+ n) 视为对 n 的读取。 v 也是如此。

UPD2:您能否提供对第 1 和第 4 种情况的一些分析,如 JSR-133 秒所示。 8?

最佳答案

这里涉及两个因素。

  • 你有一个volatile字段,但是
  • 您有一个对 System.out.println同步调用,这起到了读/写屏障的作用

在两个线程中,您都在执行写入和读取。写入屏障并不能保证读取屏障。

Does the output of v=false imply the output of n=true?

如果您看到 v=false,您可能会看到 n=false,反之亦然

What would change if n were volatile?

并非如此,您可能会看到行为发生变化,具体取决于您运行的架构,但是您仍然可以看到某些机器的不确定行为。

What would change if n were java.util.List

主要的变化是你正在替换写屏障,例如n = true with a read barrier n.method 这意味着你不再有写屏障(除了调用同步方法)

这样做意味着线程之间的一致性失败的原因更多。

关于java - JMM 在实践中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39175959/

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