java - 如何防止语句被 JVM 重新排序

标签 java concurrency jvm

有没有办法保证doA先于doB执行?我想到的一件事是将每个语句包装在一个同步块(synchronized block)中。

object1.doA();
object2.doB();

对 volatile 变量的方法调用是否充当 volatile 写入?

编辑 - 我真正需要的是让其他线程在 doB 之前看到 doA 的效果。

最佳答案

从执行该段代码的线程的角度来看,这些语句不会重新排序(它们在实践中可能会重新排序,但前提是从该线程的角度来看重新排序没有影响)。

然而,另一个线程可能会在看到 doA 的结果之前看到 doB 的结果。如果这是一个问题,您应该锁定代码以使其成为原子代码,例如通过使用 synchronized block 。

请注意,使用两个 synchronized block 并没有取得多大效果 - 特别是 JVM 很可能无论如何都会将它们合并为一个(假设它们使用相同的监视器,但如果它们不这样做)那么你不一定会实现原子性)。

关于java - 如何防止语句被 JVM 重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22178874/

相关文章:

java - 服务器未正确读取发送的 UDP 数据包

java - 如何克服 ConstraintLayout 准则导致的别名问题?

java - G1 收集器每秒执行 50 次

java - 以编程方式检查可用的 heapSize?

用于 super 方法的 Java vtable

java - ArrayList中如何避免重复?

java - 如何在 Spring Data JPA 或 hibernate 中存储实体

java - 同步以确保对不可变对象(immutable对象)的引用将被另一个线程看到

Java 在使用前锁定变量赋值。为什么?

scala - 处理应用程序级并发 - 我有什么选择?