Подтвердить что ты не робот

Почему LinkedBlockingQueue # poll() может зависать?

Это мой код:

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

Обычно он работает, но иногда, при некоторых обстоятельствах (до сих пор не знаю, когда и почему) poll() метод не возвращает NULL, но сохраняет его поток в состоянии WAITING навсегда. Почему и как это могло произойти?

Я пробовал ArrayBlockingQueue - тот же эффект. Я использую OpenJDK для Mac OS:

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)

Тот же код отлично работает с Oracle Java 1.6 на Mac OS. Это то, где потоки застревают:

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(), я сразу же попадаю в ту же ситуацию.

4b9b3361

Ответ 1

Это [неприятная] проблема, которая была решена в ранних версиях Java 7. Если вы перейдете на новую JVM, у вас не будет этой проблемы (кажется, исправление не было перенесено на Java 6).

Смотрите здесь и .