让说线程1的对象同步
synchronize(object){
//statement1
//statement2
//statement3
}
发生了什么锁对象,如果线程1崩溃的语句2,将JVM松开线程1时自动出现这种情况的锁? 因为否则,如果线程2瓦亭对对象的锁被释放并线程1崩溃,线程2将永远等待。
让说线程1的对象同步
synchronize(object){
//statement1
//statement2
//statement3
}
发生了什么锁对象,如果线程1崩溃的语句2,将JVM松开线程1时自动出现这种情况的锁? 因为否则,如果线程2瓦亭对对象的锁被释放并线程1崩溃,线程2将永远等待。
它在定义JLS#14.19 :
synchronized ( Expression ) Block
如果块的执行以任何理由突然完成,然后将显示器解锁和同步语句出于同样的原因突然完成。
你应该想到的synchronized
块:
synchronized(lock) {
// code
}
作为(伪)的当量:
lock.acquire();
try {
// code
} finally {
lock.release();
}
因此,锁将被释放,无论在代码段会发生什么。
是的,监视器(未锁)将被释放。
如果你想读它的Java虚拟机规范将要具体说明这一点。
在JVM规范,准确的参考中可以找到部分2.11.10
当调用为其ACC_SYNCHRONIZED设定的方法,该执行线程进入监视器,调用方法本身,并离开显示器的方法调用是否正常或突然结束。 在执行线程拥有该显示器的时候,没有其他线程可以进入。 如果一个异常同步方法和同步方法不处理该异常的调用期间抛出, 该方法的显示器之前,例外的是(重新)抛出的同步方法的自动退出。