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