gpt4 book ai didi

java - !different! 之间的总订单 volatile 变量?

转载 作者:搜寻专家 更新时间:2023-11-01 03:30:09 25 4
gpt4 key购买 nike

考虑以下 Java 代码:

volatile boolean v1 = false;
volatile boolean v2 = false;

//Thread A
v1 = true;
if (v2)
System.out.println("v2 was true");

//Thread B
v2 = true;
if (v1)
System.out.println("v1 was true");

如果有一个全局可见的 volatile 访问总顺序,那么总是会达到至少一个 println。

Java 标准真的保证了这一点吗?或者这样的执行是否可行:

A: v1 = true;
B: v2 = true;
A: read v2 = false;
B: read v1 = false;
A: v2 = true becomes visible (after the if)
B: v1 = true becomes visible (after the if)

我只能在标准中找到关于访问相同 volatile 变量的语句(但我可能遗漏了一些东西)。

“写入 volatile 变量 (§8.3.1.4) v 与任何线程对 v 的所有后续读取同步(其中后续是根据同步顺序定义的)。”

http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.4.4

谢谢!

最佳答案

v1/v2的volatile read/write这4个 Action 都是同步 Action 。执行对它们有一个同步顺序,这是一个总顺序。该顺序必须保持每个线程的程序顺序。

这使得推理变得非常容易。显然,至少对于 2 个变量中的 1 个,在“同步顺序”中,写入它的顺序先于读取它。因此,写入与读取“同步”。因此,写入“先于”读取。因此,写入对读取可见。

关于java - !different! 之间的总订单 volatile 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2555463/

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