我正在研究一些二进制Java代码中的潜在并发问题。代码有时会有一个奇怪的行为,但我不确定它是否真的是由于代码本身的并发问题,或者它是否是其他东西。我自己无法重现这种奇怪的行为,但只看到它发生在我们的日志文件中。
是否有办法提高JVM的上下文切换频率,以便以更高的概率表现出潜在的并发问题?最好不要在代码中显式插入对Thread :: yeild或Thread :: sleep的调用。
答案 0 :(得分:1)
我认为Thread-weaver测试框架可以帮助您。我已经尝试过它已经有一段时间了,但它确实允许你强制进行特定的调度。它也可以在某种默认模式下运行,其中测试了两种方法之间的大量交错。
这是一个简单的示例测试(使用默认交错)
public class MyListTest {
private MyList<String> list;
@Test
public void testThreading() {
AnnotatedTestRunner runner = new AnnotatedTestRunner();
// Run all Weaver tests in this class, using MyList as the Class Under Test.
runner.runTests(this.getClass(), MyList.class);
}
@ThreadedBefore
public void before() {
list = new MyList<>();
}
@ThreadedMain
public void mainThread() {
list.putIfAbsent("A");
}
@ThreadedSecondary
public void secondThread() {
list.putIfAbsent("A");
}
@ThreadedAfter
public void after() {
assertThat(list).hasSize(1);
}
}