PriorityBlockingQueue
有多少锁?
take
和put
操作是否已同步?
我找不到有关此类队列的更多信息。我使用的是单线程PriorityQueue
。
答案 0 :(得分:13)
PriorityBlockingQueue有多少锁?
这是一个无关紧要的实现细节。除非您想了解它是如何实现的,否则我只能建议您查看源代码。
接受和放置操作是否同步?
严格来说,它们可能没有同步,但是这个类是线程安全的,所以你可以同时在多个线程中进行同步。
注意:PriorityBlockingQueue
的javadoc在这一点上不是很明确,但如果你看at the javadoc of the java.util.concurrent package,你会看到:
java.util.concurrent中的五个实现支持扩展的BlockingQueue接口,该接口定义了put和take的阻塞版本:LinkedBlockingQueue,ArrayBlockingQueue,SynchronousQueue,PriorityBlockingQueue和DelayQueue。
BlockingQueue实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果。但是,除非在实现中另有说明,否则批量收集操作addAll,containsAll,retainAll和removeAll不一定以原子方式执行。
答案 1 :(得分:1)
通过阅读HotSpot Java 7源代码,只有一个锁,称为lock
。
不同的实现是可能的,因为这不是该类的文档要求。
答案 2 :(得分:0)
来自PriorityBlockingQueue的Javadoc:
一个无限制的阻塞队列,它使用与类相同的排序规则 PriorityQueue并提供阻塞检索操作。虽然这个 队列在逻辑上是无限制的,尝试添加可能由于失败而失败 资源耗尽(导致OutOfMemoryError)。这个课没有 允许null元素。依赖于自然排序的优先级队列 也不允许插入不可比较的对象(这样做 导致ClassCastException)。
内部实施无关紧要。