在同步子句中抛出异常的副作用?
-
19-09-2019 - |
题
从同步子句中抛出异常是否有任何不清楚的副作用?锁会发生什么情况?
private void doSomething() throws Exception {...}
synchronized (lock) {
doSomething();
}
解决方案
我认为没有副作用。
的锁保证在所有情况下被终止,然后一个异常也不例外(双关语意)。
其他提示
正如您所希望的,锁被正常释放。
作为参考,JLS 中保证此行为的相应部分是 § 14.19:
如果Block的执行正常完成,则锁被解锁并且synchronized语句正常完成。如果该块的执行由于任何原因突然完成,则锁将被解锁,并且同步语句会因相同原因突然完成。
(“突然完成”在 JLS 的其他地方定义,包括来自 JVM 的异常、由 throw
, ,并使用 break
, continue
, , 或者 return
要传输到块外的语句。)
不隶属于 StackOverflow