当一个持有ReentrantReadWriteLock锁的线程失败时会发生什么?

时间:2009-11-12 16:41:11

标签: java multithreading

如果持有ReentrantReadWriteLock.writeLock()的线程由于未捕获的异常而停止执行,是锁被释放,还是被保留,所有其他线程现在都已死锁?

2 个答案:

答案 0 :(得分:3)

我假设“失败”是指未捕获的异常从Thread的run方法的顶部传播,导致它停止执行。

如果使用finally的线程正确阻塞,那么它将在返回堆栈的路上解锁writeLock

但是,如果线程没有调用unlock(),它仍然保留该监视器,即使它不再运行 - 所以是的,其他线程将会死锁。

这就是正确获取和释放资源至关重要的原因。并且还有一个理由坚持使用synchronized块除非/直到你可以确定你需要特定锁的功能 - 因为它们不能无法释放。 (在你的情况下,我确定你确实需要单独的读/写锁,我在这里提出一个更普遍的观点。)

答案 1 :(得分:0)

使用“Explicit Lock”时,必须使用try-finally块,以释放您获得的任何锁定。

这是使用synchronized。

之间的关键区别