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

从同步子句中引发异常有什么不清楚的副作用吗? 锁怎么了?

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


synchronized (lock) {
doSomething();
}
21534 次浏览

I see no side-effect.

The lock is guaranteed to be terminated in all cases, and an exception is no exception (pun intended).

As you would hope, the lock is released normally.

For reference, the appropriate section of the JLS which guarantees this behaviour is § 14.19:

If execution of the Block completes normally, then the lock is unlocked and the synchronized statement completes normally. If execution of the Block completes abruptly for any reason, then the lock is unlocked and the synchronized statement then completes abruptly for the same reason.

('abrupt completion' is defined elsewhere in the JLS to include exceptions from JVM, exceptions raised by throw, and use of the break, continue, or return statements to transfer outside the block.)