【发布时间】:2015-08-20 00:46:51
【问题描述】:
考虑多个线程试图访问临界区,一个线程在同步块内发生异常会发生什么,它具有等待()和通知()来累积和释放锁。
【问题讨论】:
-
@KennethClark 没有手动释放锁会发生什么。如果有任何死锁
-
锁保证在所有情况下都会被终止
标签: java multithreading
考虑多个线程试图访问临界区,一个线程在同步块内发生异常会发生什么,它具有等待()和通知()来累积和释放锁。
【问题讨论】:
标签: java multithreading
同步监视器将被释放:“如果主体的执行已经完成,无论是正常还是突然,都会在同一监视器上自动执行解锁操作。” Java 语言规范17.1. Synchronization.
其他线程将能够继续同步,并调用wait和notify。
如果异常线程持有一些关键的程序逻辑资源,你可能需要使用 try-finally 来确保它被释放。
【讨论】:
您可能以与资源(连接,I / O)相同的方式考虑锁,但与资源不同,一旦执行线程到达临界区的退出边界,锁将被释放(监视器/同步块右括号)不管是否抛出异常。
如果 Block 的执行由于某种原因突然完成,则监视器被解锁并且同步语句由于同样的原因突然完成。
【讨论】:
synchronized语句突然完成从而释放锁(监视器)
如前所述,如果发生异常,则应处理/抛出异常以继续执行,否则执行将停止。因此,在您的场景中,如果发生异常,则会对其进行处理并进一步释放锁。
【讨论】: