微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jUnit 4 如何设法通过超时中断不间断的死锁测试以及为什么 jUnit 5 不能这样做?

如何解决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 举报,一经查实,本站将立刻删除。