gpt4 book ai didi

java - 在 Java 内存模型中重新排序外部操作

转载 作者:行者123 更新时间:2023-11-30 10:57:11 24 4
gpt4 key购买 nike

我目前正在学习 Java 内存模型,以及它如何影响编译器可能进行的重新排序。但是,我对外部操作有点困惑。 JMM 将它们定义为可以在操作之外观察到的操作。出发this question ,我将外部操作理解为打印值、写入文件、网络操作等。

现在,重新排序对外部操作有何影响?我认为很明显外部操作不能用另一个外部操作重新排序,因为这会改变程序的可观察行为(因此根据 JMM 不是有效的转换)。但是如何使用正常的内存访问或同步操作重新排序外部操作呢?例如:

volatile int v = 5;
int x = v;
System.out.println("!");

print 和 int x = v 可以在这里重新排序吗?我看不到它改变了行为,但 volatile v 的读取与监视器获取相同,所以我认为重新排序是无效的。

最佳答案

添加

外部操作以避免意外结果:

class ExternalAction { 

int foo = 0;

void method() {
jni();
foo = 42;
}

native void jni(); /* {
assert foo == 0;
} */
}

假设实现了 JNI 方法来运行相同的断言,您不会期望它会失败。 JIT 编译器无法确定任何外部 的结果,因此 JMM 也禁止此类重新排序。

关于java - 在 Java 内存模型中重新排序外部操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32717014/

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