从同步子句中抛出异常是否有任何不清楚的副作用?锁会发生什么?
private void doSomething() throws Exception {...}
synchronized (lock) {
doSomething();
}
从同步子句中抛出异常是否有任何不清楚的副作用?锁会发生什么?
private void doSomething() throws Exception {...}
synchronized (lock) {
doSomething();
}
我看没有副作用。
锁保证在所有情况下都会被终止,并且异常不是异常(双关语)。
如您所愿,锁被正常释放。
作为参考,保证这种行为的 JLS 的适当部分是§ 14.19:
如果 Block 的执行正常完成,则锁被解锁并且同步语句正常完成。如果 Block 的执行由于任何原因突然完成,则锁定被解锁,并且同步语句随后由于相同的原因而突然完成。
(“突然完成”在 JLS 的其他地方定义,包括来自 JVM 的异常、由 引发的异常throw
以及使用break
、continue
或return
语句在块外传输。)