如何解决jUnit 4 如何设法通过超时中断不间断的死锁测试以及为什么 jUnit 5 不能这样做?
如果我错了,请纠正我,但据我所知,没有办法不间断地中断等待锁定的 Java 线程。我有以下模拟死锁的测试
public void deadLockTimeouttest() {
CyclicBarrier barrier = new CyclicBarrier(2);
Thread t1 = new Thread(() -> {
l1.lock();
try {
barrier.await();
} catch (InterruptedException | brokenBarrierException e) {
throw new RuntimeException(e);
}
try {
l2.lock();
try {
System.out.println("t1 succeeded");
} finally {
l2.unlock();
}
} finally {
l1.unlock();
}
});
t1.start();
l2.lock();
try {
barrier.await();
} catch (InterruptedException | brokenBarrierException e) {
throw new RuntimeException(e);
}
try {
l1.lock();
try {
System.out.println("main thread succeeded");
} finally {
l1.unlock();
}
} finally {
l2.unlock();
}
}
如果我使用 jUnit 4 @Test(timeout = 1_000L)
运行它,测试会被中断,而预期不会这样做:
java.lang.Exception: 1000 毫秒后测试超时
现在如果我用 jUnit 5 运行相同的测试
@Test
@Timeout(1)
它只是卡在了预期的地方(两个线程都试图不间断地获取第二个锁)。并且 jUnit 不会在 1 秒内失败。以我对不间断 .lock()
的了解,这在意料之中。但是既然 jUnit 4 以某种方式设法通过了测试,为什么 jUnit 5 没有这样做呢?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。