在 Java 中如何进行多线程测试

1. java 多线程测试

在任何语言中,多线程测试都是比较困难的,在这里我介绍下 java 的多线程测试 jcstress.

  • jcstressOpenJDK 提供的一个测试多线程的框架
  • 主要由多个 Actor 来构成,每个 Actor 就是一个线程。
  • 通过匹配 Outcome 的结果来报告测试
  • 运行之后的结果为 html 文件,需要你自己查看。

示例代码:

  • 测试自旋锁,其实也告诉你该怎么编写 CAS
  • 执行命令 gradle jcstress,会生成目录 build/reports/jcstress
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@JCStressTest
@Outcome(id = {"1, 2", "2, 1"}, expect = Expect.ACCEPTABLE, desc = "Mutex works")
@Outcome(id = "1, 1", expect = Expect.FORBIDDEN, desc = "Mutex failure")
@State
public class Mutex_03_SpinLock {

  private final AtomicBoolean taken = new AtomicBoolean(false);
  private int v;

  @Actor
  public void actor1(II_Result r) {
    while (taken.get() || !taken.compareAndSet(false, true))
      ; // wait
    { // critical section
      r.r1 = ++v;
    }
    taken.set(false);
  }

  @Actor
  public void actor2(II_Result r) {
    while (taken.get() || !taken.compareAndSet(false, true))
      ; // wait
    { // critical section
      r.r2 = ++v;
    }
    taken.set(false);
  }
}

2. 代码实现位置

github 地址

3. 参考

强烈建议大家看官方代码, 地址: https://github.com/openjdk/jcstress

0%