JCStress使用

构建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