gpt4 book ai didi

java - volatile 读取是否发生在 volatile 写入之前?

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:37 30 4
gpt4 key购买 nike

我试图理解为什么这个例子是一个正确同步的程序:

a - volatile
Thread1:
x=a
Thread2:
a=5

因为存在冲突访问(存在对 a 的写入和读取),所以在每个顺序一致性执行中,访问之间必须存在先行关系。假设顺序执行之一:

1. x=a
2. a=5

1 是否先于 2,为什么?

最佳答案

Is 1 happens-before 2, why?

我不是 100% 确定我理解你的问题。

如果您有一个 volatile 变量a,并且一个线程正在读取它而另一个正在写入它,那么这些访问的顺序可以是任一个顺序。这是一个 race condition . JVM 和 Java 内存模型 (JMM) 保证什么取决于哪个操作先发生。

写入可能刚刚发生,读取看到更新后的值。或者写入可能发生在读取之后。所以 x 可以是 5a 的先前值。

every sequential consistency execution must be happens-before relation between that accesses

我不确定这意味着什么,所以我会尝试具体说明。 volatile 的“happens before relation”意味着在读取同一变量之前,所有先前对 volatile 变量的内存写入都保证已完成。但是这种保证绝不能解释受竞争条件影响的两个 volatile 操作之间的时间。保证读者已经看到写入,但只有写入发生在读取之前。

您可能认为这是一个非常弱的保证,但在线程中,其性能通过使用本地 CPU 缓存得到显着提高,读取字段的值可能来自缓存内存段而不是中央内存。该保证对于确保在 volatile 读取发生时使本地线程内存失效和更新至关重要,以便线程可以适本地共享数据。

同样,JVM 和 JMM 保证,如果您正在从 volatile 字段 a 中读取,那么任何写入到相同字段的操作都之前发生过 读取将被它看到——写入的值将被正确发布并且对读取线程可见。但是,此保证决不会决定顺序。它并没有说写入必须在读取之前发生。

关于java - volatile 读取是否发生在 volatile 写入之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16615140/

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