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

标签 java multithreading volatile

考虑以下 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/

相关文章:

java - 使用特定模式将 Instant 格式化为 String

java - 客户端渲染 JSON 与 GPB( Protocol Buffer )

java - Jetty 需要 URL 的 SSL 客户端证书

c - 标准 C 函数的线程安全版本 'localtime'

python - 在 Python 中进行多线程/并发编程有哪些选择?

java - 非 volatile 字段的发布和读取

c - 如何强制在 C 中读取未被优化的未使用内存?

registry - 有没有办法验证 Windows 注册表项是否易失(REG_OPTION_VOLATILE)?

java - 如何使用java获取redis db中的哈希列表?

java - 应用程序级锁定和 hibernate 乐观锁定