在同步子句中抛出异常的副作用?

时间:2010-01-07 09:35:57

标签: java exception synchronized

在synchronized子句中引发异常是否有任何不明确的副作用? 锁会发生什么?

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

synchronized (lock) {   
    doSomething();       
}

2 个答案:

答案 0 :(得分:88)

我认为没有副作用。

在所有情况下都保证锁定被终止,并且异常也不例外(双关语)。

答案 1 :(得分:39)

正如您所希望的那样,锁定正常释放。

作为参考,保证此行为的JLS的相应部分是§ 14.19

  

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

('突然完成'在JLS的其他地方定义,包括来自JVM的异常,throw引发的异常,以及breakcontinue或{{1}的使用转移到块外的语句。)