2009-11-12 99 views
1

如果线程持有ReentrantReadWriteLock.writeLock()停止执行,由于未捕获到异常,被锁释放,抑或是举行,现在所有的其他线程死锁?会发生什么?

回答

3

我假设通过“失败”,你的意思是一个未捕获的异常传播离开线程的顶端run方法,导致它停止执行。

如果线程使用finally正确阻塞,那么它将在备份堆栈的过程中解锁writeLock

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

这就是为什么它是获取和正确释放资源的关键重要。而且也是一个原因坚持​​块,除非/直到你能证明你需要特定的锁的功能 - 因为他们不能不被释放。 (在你的情况下,我敢肯定,你需要单独的读/写锁,我正在做一个更一般的点这里)。

0

您必须使用使用“明确锁定”当一个try-finally块,释放你获得的任何锁定。

这是使用同步之间的关键区别。