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


70

从同步子句中引发异常是否有任何不清楚的副作用?锁怎么了?

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

synchronized (lock) {   
    doSomething();       
}

Answers:


104

我没有副作用。

保证在所有情况下都将终止锁定,并且例外也不是例外(双关语是故意的)。


13
+1以作证,有时例外也不例外:
Andreas Dolk 2010年

1
@KLE错误呢?如果代码抛出Stackoverflow或OutOfMemory,会发生什么?
Pacerier

此页面也值得一看,仅供参考。
imnd_neel 2014年

就像finally子句一样!
minmaxavg

双关语很棒,+ 1
Hazok

41

如您所愿,该锁可以正常释放。

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

如果该Block的执行正常完成,则将解锁该锁,并且synced语句将正常完成。如果由于某种原因突然终止了Block的执行,则将锁解锁,然后由于相同的原因而突然完成synced语句。

(“急剧完成”在别处JLS定义为包括从JVM异常,通过引发的异常throw,和使用breakcontinuereturn语句到块外转移。)


1
如果doSomething();抛出java.lang.StackOverflowError会发生什么?
Pacerier
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.