当我怀疑java语言规范允许某些指令重新排序时,我想在jcstress测试中重现它。我该怎么做呢?例如,在下面的代码中,Load和Store指令(我相信)允许在某些运行时环境中执行时重新排序。但是,当我在英特尔x84_64 Ubuntu中运行jcstress时,结果没有显示任何重新排序。
import org.openjdk.jcstress.annotations.*;
import org.openjdk.jcstress.infra.results.I_Result;
@JCStressTest
@Outcome(id = "0", expect = Expect.ACCEPTABLE,
desc = "Default outcome.")
@Outcome(id = "2", expect = Expect.ACCEPTABLE_INTERESTING,
desc = "Load-Store reordering happens.")
@State
public class ReorderingTest {
int d;
int e;
int f;
@Actor
public void actor1() {
int ee = e; // Load
d = 1; // Store
if (ee == 2) {
f = 2;
}
}
@Actor
public void actor2() {
if (d == 1) {
e = 2;
}
}
@Arbiter
public void arbiter(I_Result r) {
r.r1 = f;
}
}发布于 2019-05-21 03:14:43
最后,我使用显式的JVM选项观察了原始jcstress测试中的重新排序,并以更长的时间运行它。
-jar -f 20 -XX:-TieredCompilation,-XX:+UnlockDiagnosticVMOptions,-XX:+StressLCM,-XX:+StressGCM
然而,在下面的一个测试中,无论我运行测试多长时间,都没有观察到重新排序,尽管它看起来与其他测试相同。
// reordering can be observed!
@Actor
public void actor1() {
int ee = e; // Load
d = 1; // Store
if (ee == 2) {
f = 2;
}
}// reordering can be observed!
@Actor
public void actor1() {
f = e; // Load & Store
d = 1; // Store
}// reordering NEVER observed!
@Actor
public void actor1() {
if (e == 2) f = 2; // Load & conditionally Store
d = 1; // Store
}https://stackoverflow.com/questions/56139254
复制相似问题