有没有办法保证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/