java同步和exception处理
如果我有一个synchronized块并且在该块内的某个地方抛出了一个未在synchronized块中捕获的exception,那么当exception传播出来时是否会放弃锁定?(synchronized块)
synchronized( mutex ) { throw new Exception( "" ); }
锁定始终被释放。
来自JLS§14.19 :
“如果块的执行正常完成,则锁定被解锁并且同步语句正常完成。如果块的执行因任何原因突然完成,则锁定被解锁,同步语句因为同样的原因而突然完成。”
是的,锁被释放了。
从这里 :
Java平台的exception机制与其同步模型(第17节)集成在一起,因此锁定作为同步语句(第14.18节)发布,同步方法(第8.4.3.6节,第15.12节)的调用突然完成。
应该没问题。 无论执行路径是什么,都会释放锁 (返回,exception……)有关详细信息,请参阅此处。