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

rob*_*jaj 5 java multithreading synchronization

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

synchronize(object){
  //statement1
  //statement2
  //statement3
}
Run Code Online (Sandbox Code Playgroud)

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

ass*_*ias 11

它在JLS#14.19中定义:

synchronized ( Expression ) Block
Run Code Online (Sandbox Code Playgroud)

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


Tud*_*dor 6

你应该想到synchronized块:

synchronized(lock) {
   // code
}
Run Code Online (Sandbox Code Playgroud)

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

lock.acquire();
try {
   // code
} finally {
   lock.release();
}
Run Code Online (Sandbox Code Playgroud)

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