从我看到的文档中,
take()
方法会阻塞,直到元素变得可用为止。我的意思是,是否有一种可能的情况,当队列不空时,但尽管如此,调用
take()
由于某种原因会阻塞。
请告诉我,是否有人了解此类场景。
还有其他情况可能会阻塞吗?
不。通过我阅读代码(Java 11版本)
take()
,只有在调用时队列为空时才会阻塞。
但这并不意味着当队列变为非空时,
take()
调用将立即解除阻塞。事实上,如果两个或多个线程同时调用 take()
,可以想象,某些线程将“挨饿”,因为到达的元素始终被传递给其他等待线程。 (PriorityBlockingQueue
使用ReentrantLock
实例来协调生产者和消费者,但它们不是作为公平锁创建的。)