如果持有ReentrantReadWriteLock.writeLock()的线程由于未捕获的异常而停止执行,是锁被释放,还是被保留,所有其他线程现在都已死锁?
答案 0 :(得分:3)
我假设“失败”是指未捕获的异常从Thread的run
方法的顶部传播,导致它停止执行。
如果使用finally
的线程正确阻塞,那么它将在返回堆栈的路上解锁writeLock
。
但是,如果线程没有调用unlock()
,它仍然保留该监视器,即使它不再运行 - 所以是的,其他线程将会死锁。
这就是正确获取和释放资源至关重要的原因。并且还有一个理由坚持使用synchronized
块除非/直到你可以确定你需要特定锁的功能 - 因为它们不能无法释放。 (在你的情况下,我确定你确实需要单独的读/写锁,我在这里提出一个更普遍的观点。)
答案 1 :(得分:0)
使用“Explicit Lock”时,必须使用try-finally块,以释放您获得的任何锁定。
这是使用synchronized。
之间的关键区别