5

假设 Thread-1 在对象上同步

synchronize(object){
  //statement1
  //statement2
  //statement3
}

如果 Thread-1 在 statement2 上崩溃,对象上的锁会发生什么情况,当这种情况发生时,JVM 会自动释放 Thread-1 上的锁吗?因为否则如果 Thread-2 正在等待释放对象上的锁并且 Thread-1 崩溃,则 Thread-2 将永远等待。

4

3 回答 3

11

它在JLS #14.19中定义:

synchronized ( Expression ) Block

如果 Block 的执行由于任何原因突然完成,则监视器被解锁并且同步语句由于同样的原因突然完成。

于 2012-09-20T22:25:35.550 回答
6

你应该想到synchronized块:

synchronized(lock) {
   // code
}

相当于(伪代码):

lock.acquire();
try {
   // code
} finally {
   lock.release();
}

因此,无论代码部分发生什么,锁都会被释放。

于 2012-09-21T08:26:07.277 回答
3

是的,监视器(非锁定)将被释放。

如果您想阅读它,Java VM 规范将对此进行具体说明。

JVM 规范中的确切参考可以在第 2.11.10 节中找到

当调用设置了 ACC_SYNCHRONIZED 的方法时,执行线程进入监视器,调用方法本身,然后退出监视器,无论方法调用正常完成还是突然完成。在执行线程拥有监视器期间,没有其他线程可以进入它。如果在调用同步方法期间抛出异常并且同步方法没有处理异常,则在异常被(重新)抛出同步方法之前自动退出该方法的监视器。

于 2012-09-20T22:24:13.667 回答