2011-12-04 69 views
2

如果我有一个同步块,并在该块内的某个地方抛出一个异常,但未在同步块内捕获,那么当异常传播出去时会放弃该锁吗?(同步块)java同步和异常处理

synchronized(mutex) 
{ 
    throw new Exception(""); 
} 
+1

可能的副本[在同步子句中引发异常的副作用?](http://stackoverflow.com/questions/2019339/side-effects-of-throwing-an-exception-inside-a-synchronized-条款) – Mat

回答

4

锁始终被释放。

从JLS §14.19

“。如果块的执行正常完成,那么锁是 解锁和同步语句正常完成如果 执行该块的突然完成出于任何原因,那么。 由于同样的原因,锁被解锁并且同步语句突然完成 。“

2

是的,锁被释放。

here

Java平台的异常机制集成了它的同步模式(第17章),使锁释放同步语句(§14.18)和同步方法调用(8.4节.3.6,§15.12)突然完成。

1

应该没有问题。 无论执行路径如何,都会释放该锁(返回,例外...) 有关详细信息,请参阅this