【问题标题】:What will happen if thread throws a Exception inside synchronised block如果线程在同步块内抛出异常会发生什么
【发布时间】:2015-08-20 00:46:51
【问题描述】:

考虑多个线程试图访问临界区,一个线程在同步块内发生异常会发生什么,它具有等待()和通知()来累积和释放锁。

【问题讨论】:

标签: java multithreading


【解决方案1】:

同步监视器将被释放:“如果主体的执行已经完成,无论是正常还是突然,都会在同一监视器上自动执行解锁操作。” Java 语言规范17.1. Synchronization.

其他线程将能够继续同步,并调用wait和notify。

如果异常线程持有一些关键的程序逻辑资源,你可能需要使用 try-finally 来确保它被释放。

【讨论】:

    【解决方案2】:

    您可能以与资源(连接,I / O)相同的方式考虑锁,但与资源不同,一旦执行线程到达临界区的退出边界,锁将被释放(监视器/同步块右括号)不管是否抛出异常。

    参考:synchronized statement

    如果 Block 的执行由于某种原因突然完成,则监视器被解锁并且同步语句由于同样的原因突然完成。

    【讨论】:

    • 那么那个锁会自动释放吧
    • 是的,在异常情况下监视器被解锁并且synchronized语句突然完成从而释放锁(监视器)
    【解决方案3】:

    如前所述,如果发生异常,则应处理/抛出异常以继续执行,否则执行将停止。因此,在您的场景中,如果发生异常,则会对其进行处理并进一步释放锁。

    【讨论】:

    • 没有手动释放锁会发生什么。如果有任何死锁
    • 一般情况下,我们应该照顾所有的场景,以避免死锁的可能性。如果调用了任何死锁,那么除了重新启动应用程序之外,我们将无法做任何事情。为了避免死锁,我建议您阅读“Java 中的线程间通信”。
    猜你喜欢
    • 2011-02-24
    • 1970-01-01
    • 2023-04-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    相关资源
    最近更新 更多