72

从同步子句中抛出异常是否有任何不清楚的副作用?锁会发生什么?

private void doSomething() throws Exception {...}

synchronized (lock) {   
    doSomething();       
}
4

2 回答 2

108

我看没有副作用。

保证在所有情况下都会被终止,并且异常不是异常(双关语)。

于 2010-01-07T09:40:28.013 回答
44

如您所愿,锁被正常释放。

作为参考,保证这种行为的 JLS 的适当部分是§ 14.19

如果 Block 的执行正常完成,则锁被解锁并且同步语句正常完成。如果 Block 的执行由于任何原因突然完成,则锁定被解锁,并且同步语句随后由于相同的原因而突然完成。

(“突然完成”在 JLS 的其他地方定义,包括来自 JVM 的异常、由 引发的异常throw以及使用breakcontinuereturn语句在块外传输。)

于 2010-01-07T10:23:32.317 回答