java - 一个没有倒数到零的CountDownLatch如何不被中断返回呢?

标签 java java.util.concurrent

(对于后代,我熟悉另一个问题,它的答案似乎暗示我正在观察的情况是不可能的:Is CountDownLatch affected by spurious wakeups?)

我有一个 CountDownLatch,它是使用 1int 参数创建的。有意地,countDown() 永远不会在此锁存器上调用。

我有一个 ShutdownHook 可以中断调用 myLatch.await() 的线程,我有一个 catch block 可以处理后续的 InterruptedException.

我观察到当我的关闭 Hook 被调用时,闩锁会​​正常“唤醒”。即await()方法返回,线程未中断,其中断状态(由isInterrupted()报告)为false.

我从 CountDownLatch 文档中了解到,这种情况是不可能发生的。我错过了什么?

等待闩锁的代码如下所示:

try {
    myLatch.await();
    System.out.println("*** done via unblock");
} catch (final InterruptedException interruptedException) {
    Thread.currentThread().interrupt();
    System.out.println("*** done via interrupt");
}

当我按 CTRL-C 我的应用程序时,我看到 *** done via unblock。我阅读文档后发现这是不可能的,因为 CountDownLatch 实例不受虚假唤醒的影响。

关机 Hook 代码如下所示:

// t is the thread that is doing the await() call above
final Thread t = Thread.currentThread();
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
      t.interrupt();
      try {
          t.join();
      } catch (final InterruptedException interruptedException) {
        Thread.currentThread().interrupt();
      }
 }));

最佳答案

谢天谢地,我找到了一个代码路径,其中几个类之外的东西确实在倒计时有问题的锁存器。谢天谢地,因为 (a) 我的代码现在可以工作,并且 (b) 文档是正确的,当我们谈论 CountDownLatch#await() 时,虚假唤醒实际上不是一个东西™ .

关于java - 一个没有倒数到零的CountDownLatch如何不被中断返回呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58176200/

相关文章:

java - 实现相同接口(interface)的两个类可以在其公共(public)方法中使用其他类的对象作为参数吗?

java - I/O 错误异常处理 : Unreachable catch block for IOException. try 语句主体永远不会抛出此异常

java - 网络服务器流式传输数据数组中的消费者-生产者问题

java - Java 中的启动/暂停/恢复方法

java - 如何使用 XML 配置使用 SimpleTriggerFactoryBean 将重复间隔设置为 24 小时

java - spring 和 JBoss7 中的 jndi 查找问题

java - 并发框架中shutdownNow的使用

Java等待 future 结果而不阻塞

java - COPY FROM 和 Postgres 中的 C3PO 连接池

java - 如何在 java.util.concurrent.atomic 包中定义的类中实现原子性?