java - 在存在 volatile 变量的情况下可以发生重新排序吗?

标签 java volatile

我的做法如下,我的程序中只有 2 个线程。

// Thread 1
write a = 0
write a = 1
write volatile b = 1

// Thread 2
read volatile b // this I always do after write volatile b in the 1st thread
read a

我已经阅读了 Java 内存模型以及我在线程 2 中的理解 read a总是给我 1。

我想知道我的理解是否正确。

特别是,重新排序是否仍然会发生,所以我在第二个线程中看到 a = 0?

最佳答案

您的假设大部分是正确的。不过,我会稍微重述一下,以符合 JMM 的保证。

如果线程 2 读取 b 并看到值 1,那么后续读取 a 将为 1。就像你说的,如果 Thread 2 总是在线程 1 完成写入之后读取 b,然后线程 2 将看到值 1,并且 a 的读取将如您所期望的那样。

关于java - 在存在 volatile 变量的情况下可以发生重新排序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25548547/

相关文章:

java - 防止java乱序执行

java - 使用 volatile 变量和信号量 - Java

java - 运行基本 Spring Batch 示例时出错 - 由 : java. lang.ClassNotFoundException : org. hsqldb.jdbcDriver 引起

java - 扫描仪对象不返回预期结果

c++ - 分配一个易变的右值

java - 需要有关实现的 java 代码中的 volatile 和非 volatile 概念的帮助吗?

c - 调用 `volatile`时需要 `longjmp()`?

java - 带有十进制坐标和多个文本的 System.out.printf

java - 为什么只有在运行 JUnit 测试时堆空间才会用完?

java - 为java threadPool中的每个线程设置超时