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

Yos*_*ale 63 java exception synchronized

从同步子句中抛出异常是否有任何不明确的副作用?锁会发生什么?

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

synchronized (lock) {   
    doSomething();       
}
Run Code Online (Sandbox Code Playgroud)

KLE*_*KLE 93

我认为没有副作用.

锁是保证被终止在所有情况下,和一个异常也不例外(双关语意).

  • 提供证据的+1,有时异常不是例外:-)) (13认同)
  • @KLE 出现错误怎么办?如果代码抛出 Stackoverflow 或 OutOfMemory 异常,会发生什么情况? (2认同)

Cow*_*wan 39

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

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

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

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

  • 如果 `doSomething();` 抛出 java.lang.StackOverflowError 会发生什么? (2认同)