在synchronized子句中抛出exception的副作用?

从同步子句中抛出exception有没有不明确的副作用? 锁会发生什么?

private void doSomething() throws Exception {...} synchronized (lock) { doSomething(); } 

我没有看到副作用。

在所有情况下保证被终止 ,并且例外也不例外(双关意图)。

正如你所希望的那样,锁是正常释放的。

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

如果Block的执行正常完成,则locking被解锁并且同步语句正常完成。 如果程序块的执行由于某种原因突然完成,则locking被解锁,同步语句突然完成,原因相同。

(在JLS的其他地方定义了“突然完成”,以包含来自JVM的exception,由throwexception,以及使用breakcontinuereturn语句在块之外传输。