问题描述
如果我错了,请纠正我,但据我所知,没有办法不间断地中断等待锁定的 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 (将#修改为@)