Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以对多个线程使用PriorityBlockingQueue吗?_Java_Multithreading_Thread Safety - Fatal编程技术网

Java 我可以对多个线程使用PriorityBlockingQueue吗?

Java 我可以对多个线程使用PriorityBlockingQueue吗?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,PriorityBlockingQueue有多少个锁? take和put操作是否同步? 我找不到关于这种队列的太多信息。在阅读HotSpot Java 7源代码时,我使用了单线程的PriorityQueue,只有一个锁,称为lock 不同的实现是可能的,因为这不是类的文档化需求 PriorityBlockingQueue有多少个锁 这是一个无关紧要的实现细节。除非您想了解它是如何实现的,在这种情况下,我只能建议您查看源代码 take和put操作是否同步 严格来说,它们可能不是同步的,但是类是线程

PriorityBlockingQueue
有多少个锁?
take
put
操作是否同步?
我找不到关于这种队列的太多信息。在阅读HotSpot Java 7源代码时,我使用了单线程的
PriorityQueue

,只有一个锁,称为
lock

不同的实现是可能的,因为这不是类的文档化需求

PriorityBlockingQueue有多少个锁

这是一个无关紧要的实现细节。除非您想了解它是如何实现的,在这种情况下,我只能建议您查看源代码

take和put操作是否同步

严格来说,它们可能不是同步的,但是类是线程安全的,因此您可以同时获取和放入多个线程

注意:
PriorityBlockingQueue
的javadoc在这一点上不是很明确,但是如果您查看,您将看到:

java.util.concurrent中的五个实现支持扩展BlockingQueue接口,该接口定义了put和take的阻塞版本:LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue和DelayQueue

以及:

阻塞队列实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果。但是,除非在实现中另有规定,否则批量收集操作addAll、containsAll、retainal和removeAll不一定以原子方式执行

从Javadoc获取:

使用与类相同的排序规则的无界阻塞队列 PriorityQueue和supplies阻止检索操作。而这 队列在逻辑上是无界的,由于 资源耗尽(导致OutOfMemoryError)。这个班没有 允许空元素。依赖自然排序的优先级队列 也不允许插入不可比较的对象(这样做 结果在ClassCastException中)


内部实现是不相关的。

BlockingQueue
javadocs中,它说“BlockingQueue实现是线程安全的”。从实际实现来看,它使用java.util.concurrent.locks.ReentrantLock实现线程安全。这几乎适用于它的所有方法。无论使用什么实现,如果它被宣传为线程安全的,那么它的行为应该像
take
put
是同步的。这意味着,如果我们认为它只有一个锁,它是一个很好的心智模型。不会有任何意外。