构建Maven项目
构建项目时,使用阿里云Maven镜像可能导致一些错误,例如无法找到对应的模板和依赖,建议直接使用Maven中央仓库
mvn archetype:generate -DinteractiveMode=false -DarchetypeGroupId=org.openjdk.jcstress -DarchetypeArtifactId=jcstress-java-test-archetype -DgroupId=com.oliverclio -DartifactId=jcstress -Dversion=1.0
编写测试类
Continuous模式
package com.oliverclio;
import org.openjdk.jcstress.annotations.*;
import org.openjdk.jcstress.infra.results.II_Result;
@JCStressTest
@Outcome(id = "1, 1", expect = Expect.ACCEPTABLE, desc = "ordered")
@Outcome(id = "0, 1", expect = Expect.ACCEPTABLE, desc = "ordered")
@Outcome(id = "1, 0", expect = Expect.ACCEPTABLE_INTERESTING, desc = "reordered")
@Outcome(id = "0, 0", expect = Expect.ACCEPTABLE, desc = "ordered")
@State
public class ConcurrencyTest {
private int x;
@Actor
public void actor1() {
x = 1;
}
@Actor
public void actor2(II_Result r) {
r.r1 = x;
r.r2 = x;
}
}
Termination模式
package com.oliverclio;
import org.openjdk.jcstress.annotations.*;
@JCStressTest(Mode.Termination)
@State
@Outcome(id = "STALE", expect = Expect.ACCEPTABLE, desc = "see no update")
@Outcome(id = "TERMINATED", expect = Expect.ACCEPTABLE, desc = "see update")
public class PlainIntegerTest {
private int i;
@Actor
public void actor() {
while (i == 0) {
}
}
@Signal
public void signal() {
i = 1;
}
}
运行测试
mvn clean install
# 测试项目中的所有测试类
java -jar .\target\jcstress.jar -v
# 测试指定测试类
java -jar .\target\jcstress.jar -v -t com.oliverclio.ConcurrencyTest
PREVIOUSHappens-Before关系
NEXTJava任务执行框架源码分析