线程在同步块内崩溃时锁定会发生什么?

让我们说Thread-1在对象上同步

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

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

它在JLS#14.19中定义:

 synchronized ( Expression ) Block 

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

你应该想到synchronized块:

 synchronized(lock) { // code } 

作为(伪代码)的等价物:

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

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

是的,显示器(不是锁定)将被释放。

如果您希望阅读它,Java VM规范将具体说明。

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

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