在synchronized子句中抛出exception的副作用?
从同步子句中抛出exception有没有不明确的副作用? 锁会发生什么?
private void doSomething() throws Exception {...} synchronized (lock) { doSomething(); }
我没有看到副作用。
锁在所有情况下保证被终止 ,并且例外也不例外(双关意图)。
正如你所希望的那样,锁是正常释放的。
作为参考,保证这种行为的JLS的适当部分是§14.19 :
如果Block的执行正常完成,则locking被解锁并且同步语句正常完成。 如果程序块的执行由于某种原因突然完成,则locking被解锁,同步语句突然完成,原因相同。
(在JLS的其他地方定义了“突然完成”,以包含来自JVM的exception,由throw
exception,以及使用break
, continue
或return
语句在块之外传输。