【问题标题】:Why LinkedBlockingQueue#poll() may hang up?为什么 LinkedBlockingQueue#poll() 可能会挂断?
【发布时间】:2012-09-10 10:34:46
【问题描述】:

这是我的代码:

// in constructor
BlockingQueue<Node> queue = new LinkedBlockingQueue<Node>();
// later in another thread
Node node = queue.poll(1, TimeUnit.SECONDS);

通常它可以工作,但有时,在某些情况下(仍然不知道何时以及为什么)poll() 方法不会返回NULL,而是将其线程永远保持在WAITING 状态。为什么以及如何会发生这种情况?

我试过ArrayBlockingQueue - 同样的效果。我在 Mac OS 上使用 OpenJDK:

java version "1.7.0_05" 
Java(TM) SE Runtime Environment (build 1.7.0_05-b06)
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)

相同的代码可以在 Mac OS 上使用 Oracle Java 1.6。这是线程卡住的地方:

sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchronizer.java:894)
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1221)
java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:340)
java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:462)

有趣的是,当我interrupt() 这个帖子并再次尝试poll() 时,我立即遇到了同样的情况。

【问题讨论】:

  • 这很可能是一个错误,我会尝试最新版本的 OpenJDK 7 或 Oracle Java 7 update 7。由于它使用系统调用,我还要确保您拥有受支持的版本操作系统。
  • 你能显示WAITING状态下线程的堆栈跟踪吗?
  • 你能写一个可重现的简单程序吗?
  • 我用更多细节更新了我的问题
  • 这个错误似乎在 JDK7 中已修复:请参阅bug report。您真的尝试在 JDK7 中重现您的错误吗?

标签: java multithreading concurrency openjdk


【解决方案1】:

这是一个在 Java 7 的早期版本中已解决的 [讨厌的] 问题。如果您迁移到较新的 JVM,您将不会遇到该问题(似乎该修复尚未向后移植到 Java 6) .

请参阅 herehere

【讨论】:

    猜你喜欢
    • 2022-08-16
    • 1970-01-01
    • 2020-08-30
    • 2021-06-09
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多