考虑多个线程正在尝试访问关键部分,在一个同步块内发生异常的一个线程会发生什么,它有wait()和notify()来累积和释放锁定。
答案 0 :(得分:11)
将释放同步监视器:"如果正常或突然完成正文的执行,则会在同一监视器上自动执行解锁操作。" Java语言规范17.1. Synchronization。
其他线程将能够继续同步,并调用wait和notify。
如果有异常的线程持有一些关键程序逻辑资源,则可能需要使用try-finally来确保它被释放。
答案 1 :(得分:0)
如上所述,如果发生异常,则应该处理/抛出它以继续执行,否则执行将停止。因此,如果发生异常,那么在您的方案中它将是相同的,然后它将被处理并且锁定将被释放。
答案 2 :(得分:0)
可能您正在考虑与资源(连接,I / O)相同的锁定,但与执行线程到达临界区域的出口边界(监视/同步块关闭括号)时,资源锁定将会释放不管抛出异常。
如果Block的执行因任何原因突然完成,则监视器将被解锁,同步语句因同样的原因而突然完成。