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

Posted

技术标签:

【中文标题】在同步子句中抛出异常的副作用?【英文标题】:Side effects of throwing an exception inside a synchronized clause? 【发布时间】:2011-01-02 10:10:37 【问题描述】:

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

private void doSomething() throws Exception ...

synchronized (lock)    
    doSomething();       

【问题讨论】:

【参考方案1】:

我认为没有副作用。

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

【讨论】:

+1 用于提供证据,有时例外并非例外 :-)) @KLE 出现错误怎么办?如果代码抛出 *** 或 OutOfMemory 会发生什么? This page 也值得一看,仅供参考。 像 finally 子句一样! 如果在两个不同的对象上嵌套同步块,如果内部同步块内抛出异常,是否会从两个对象中释放锁?【参考方案2】:

如您所愿,锁已正常释放。

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

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

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

【讨论】:

如果 doSomething(); 抛出 java.lang.***Error 会发生什么?

以上是关于在同步子句中抛出异常的副作用?的主要内容,如果未能解决你的问题,请参考以下文章

验证并在 Flux 中抛出异常不起作用

Java异常抛出

从匿名内部类的构造函数中抛出异常

在 finally 块中抛出异常

在Scala中抛出异常,啥是“官方规则”

如何在扩展中抛出异常?