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