【发布时间】:2011-01-02 10:10:37
【问题描述】:
从同步子句中抛出异常是否有任何不清楚的副作用? 锁会发生什么?
private void doSomething() throws Exception {...}
synchronized (lock) {
doSomething();
}
【问题讨论】:
标签: java exception synchronized
从同步子句中抛出异常是否有任何不清楚的副作用? 锁会发生什么?
private void doSomething() throws Exception {...}
synchronized (lock) {
doSomething();
}
【问题讨论】:
标签: java exception synchronized
我认为没有副作用。
锁保证在所有情况下都被终止,例外就是不例外(双关语)。
【讨论】:
如您所愿,锁已正常释放。
作为参考,保证此行为的 JLS 的相应部分是 § 14.19:
如果 Block 的执行正常完成,则锁被解锁并且同步语句正常完成。如果 Block 的执行由于任何原因突然完成,则锁被解锁,同步语句随后由于同样的原因突然完成。
(“突然完成”在 JLS 的其他地方定义,包括来自 JVM 的异常、throw 引发的异常,以及使用 break、continue 或 return 语句在块外传输。 )
【讨论】:
doSomething(); 抛出 java.lang.StackOverflowError 会发生什么?