发生了什么锁synchronized块内螺纹时崩溃?(What happens to the loc

2019-09-22 17:21发布

让说线程1的对象同步

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

发生了什么锁对象,如果线程1崩溃的语句2,将JVM松开线程1时自动出现这种情况的锁? 因为否则,如果线程2瓦亭对对象的锁被释放并线程1崩溃,线程2将永远等待。

Answer 1:

它在定义JLS#14.19 :

synchronized ( Expression ) Block

如果块的执行以任何理由突然完成,然后将显示器解锁和同步语句出于同样的原因突然完成。



Answer 2:

你应该想到的synchronized块:

synchronized(lock) {
   // code
}

作为(伪)的当量:

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

因此,锁将被释放,无论在代码段会发生什么。



Answer 3:

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

如果你想读它的Java虚拟机规范将要具体说明这一点。

在JVM规范,准确的参考中可以找到部分2.11.10

当调用为其ACC_SYNCHRONIZED设定的方法,该执行线程进入监视器,调用方法本身,并离开显示器的方法调用是否正常或突然结束。 在执行线程拥有该显示器的时候,没有其他线程可以进入。 如果一个异常同步方法和同步方法不处理该异常的调用期间抛出, 该方法的显示器之前,例外的是(重新)抛出的同步方法的自动退出。



文章来源: What happens to the lock when thread crashes inside a Synchronized block?