gpt4 book ai didi

java - 为什么 JMM 产生 (0, 0) 即使它被认为是禁止的结果

转载 作者:行者123 更新时间:2023-12-04 09:24:03 25 4
gpt4 key购买 nike

我正在检查 JMM 的一些语句,并编写了一个 JCS 测试,如下所示:

@JCStressTest
@State
@Outcome(expect = ACCEPTABLE, desc = "ACCEPTABLE")
public class ConcurrencyTest {
private final int a = 1;
private final int b = 2;

public ConcurrencyTest instance;

@Actor
public void actor1() {
instance = new ConcurrencyTest();
}

@Actor
public void actor2(II_Result result) {
ConcurrencyTest c = instance;
if (c != null) {
result.r1 = c.a;
result.r2 = c.b;
}
}
}
运行此测试后,我看到以下结果:

(0, 0) (1, 2)


虽然 JMM 明确声明结果 (0, 0) 是禁止的,但为什么会发生这种情况?

最佳答案

让我们稍微修改一下代码:

@JCStressTest
@State
@Outcome(id = "0, 0", expect = Expect.FORBIDDEN)
@Outcome(id = "1, 2", expect = Expect.ACCEPTABLE)
@Outcome(id = "-1, -1", expect = Expect.ACCEPTABLE)
public class ConcurrencyTest {

private final int a = 1;
private final int b = 2;

public ConcurrencyTest instance;

@Actor
public void actor1() {
instance = new ConcurrencyTest();
}

@Actor
public void actor2(II_Result result) {
ConcurrencyTest c = instance;
if (c != null) {
result.r1 = c.a;
result.r2 = c.b;
} else { // <-- this is what you care about
result.r1 = -1;
result.r2 = -1;
}
}
}
您认为来自 @Outcome(id = "0, 0") 的值在哪里?来自?这些是您在 II_Result 中设置的持有两个 int s,默认值为 0 .
因此,当 c == null (意味着 actor1 没有运行),即 if (c != null) { ... 不会被输入。所以,在你的代码中,你什么都不做:导致这些默认值 r1r2为零。您应该通过一个简单的 else 来处理这种默认情况。 ,就像我一样。

关于java - 为什么 JMM 产生 (0, 0) 即使它被认为是禁止的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63050742/

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