在同步子句中引发异常的副作用?

2022-08-31 13:28:26

从同步子句中引发异常是否存在任何不清楚的副作用?锁会发生什么变化?

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

synchronized (lock) {   
    doSomething();       
}

答案 1

我没有看到任何副作用。

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


答案 2

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

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

如果 Block 的执行正常完成,则锁定将解锁,同步语句将正常完成。如果 Block 的执行由于任何原因突然完成,则锁定将被解锁,然后同步语句会出于同样的原因突然完成。

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