假设 Thread-1 在对象上同步
synchronize(object){
//statement1
//statement2
//statement3
}
如果 Thread-1 在 statement2 上崩溃,对象上的锁会发生什么情况,当这种情况发生时,JVM 会自动释放 Thread-1 上的锁吗?因为否则如果 Thread-2 正在等待释放对象上的锁并且 Thread-1 崩溃,则 Thread-2 将永远等待。
假设 Thread-1 在对象上同步
synchronize(object){
//statement1
//statement2
//statement3
}
如果 Thread-1 在 statement2 上崩溃,对象上的锁会发生什么情况,当这种情况发生时,JVM 会自动释放 Thread-1 上的锁吗?因为否则如果 Thread-2 正在等待释放对象上的锁并且 Thread-1 崩溃,则 Thread-2 将永远等待。
你应该想到synchronized
块:
synchronized(lock) {
// code
}
相当于(伪代码):
lock.acquire();
try {
// code
} finally {
lock.release();
}
因此,无论代码部分发生什么,锁都会被释放。
是的,监视器(非锁定)将被释放。
如果您想阅读它,Java VM 规范将对此进行具体说明。
JVM 规范中的确切参考可以在第 2.11.10 节中找到
当调用设置了 ACC_SYNCHRONIZED 的方法时,执行线程进入监视器,调用方法本身,然后退出监视器,无论方法调用正常完成还是突然完成。在执行线程拥有监视器期间,没有其他线程可以进入它。如果在调用同步方法期间抛出异常并且同步方法没有处理异常,则在异常被(重新)抛出同步方法之前自动退出该方法的监视器。