代码中的线程a会结束吗?

public class InterruptSynchronizedDemo {

  private static Object lock = new Object();

  private static class A extends Thread {

    @Override
    public void run() {
      synchronized (lock) {
        while (!Thread.currentThread().isInterrupted()) {}
      }
      System.out.println("exit");
    }
  }

  public static void test() throws InterruptedException {
    synchronized (lock) {
      A a = new A();
      a.start();
      Thread.sleep(1000);
      a.interrupt();
      a.join();
    }
  }

  public static void main(String[] args) throws InterruptedException {
    test();
  }
}

#面试问题记录##并发编程#
27届毕业生-Java面试专辑 文章被收录于专栏

帮您起飞,助您着陆心仪大厂。

全部评论
答案:不会。 主线程发出中断 (无效的操作): 主线程休眠 1 秒后醒来,调用 a.interrupt()。 关键知识点:synchronized 的阻塞是不可中断的。 如果线程 A 正在 sleep、wait 或 join,中断会让它抛出异常醒来。 但线程 A 现在的状态是 BLOCKED (正在等待获取锁)。此时调用 interrupt() 仅仅是将线程 A 的中断标记位设置为 true,并不会把它从等待锁的队列中唤醒,也不会抛出异常。线程 A 继续死等锁。 死锁形成 (join 的陷阱): 主线程调用 a.join()。 join() 的含义是:“主线程暂停,等待线程 A 执行结束”。 致命的细节: 虽然 join() 内部调用了 wait() 会释放调用者(主线程)持有的线程对象 A 的锁,但它绝不会释放主线程持有的外部对象 lock 的锁。 死锁闭环: 主线程:拿着 lock,等待 线程 A 结束。 线程 A:为了结束(为了执行 run),必须先拿到 lock。 关键两点: synchronized 不响应中断: 线程阻塞在 synchronized 入口时,是叫不醒的。这是它与 ReentrantLock (特别是 lockInterruptibly()) 的重要区别。 join 不释放外部锁: 在同步块内部调用 join 是非常危险的操作,容易导致死锁。 那如何修复呢?
点赞 回复 分享
发布于 03-06 12:37 上海
关于中断的本质:https://www.nowcoder.com/discuss/859397356033171456
点赞 回复 分享
发布于 03-06 12:28 上海

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务