Java中的所有队列都是线程安全的吗?

4

在Java中存在许多队列实现,例如LinkedList、BlockingQueues。它们都是线程安全的吗?如果你的回答是否定的,哪些实现支持并发访问并提供最佳性能?

注意:我正在使用JDK 1.6。


4
阅读各自类的Javadocs时,其中的措辞到底让你感到困惑了什么? - Marko Topolnik
为什么你不读一下Javadoc文档呢?难道你期望我们替你阅读并在这里发布摘要吗? - AlexWien
阅读文档,所有内容都在那里(来自LinkedList文档的“...请注意,此实现未同步...”)。 - baba smith
StackOverflow不是一个文档阅读服务。每个实现的Javadocs都会明确地告诉你你所询问的内容。 - Brian Roach
2个回答

10
大多数标准集合都不是线程安全的。当您阅读API文档时,会发现这一点。
例如,LinkedList文档中写道:
如果多个线程同时访问链表,并且其中至少一个线程在结构上修改了该列表,则必须在外部进行同步。
对于从多个线程访问的集合,您应该查看java.util.concurrent包。

7

例如,LinkedList 不是线程安全的。

java.util.concurrent 包中的数据结构是线程安全的。

最佳性能取决于您对数据结构的使用方式。您选择实现不是基于其性能,而是基于队列的行为以及您需要对队列执行的操作。例如,SynchronousQueueLinkedListArrayBlockingQueue 的行为完全不同。


但是,当我在多个线程中修改一个非线程安全的集合,并且相应的代码段被synchronized(this)包围时,这也会强制应用程序表现出线程安全性,对吗? - icbytes
不,那还不够。所有的读取访问也必须同步。队列上的所有迭代也必须同步。 - JB Nizet
当然,假设任何访问/修改都被synchronized(this)包围,会更好吗? - icbytes
是的,只要你永远不忘记这样做,那就是线程安全的。封装队列在一个线程安全的对象中,或者从一开始就使用一个线程安全的队列会更加稳定。 - JB Nizet
所以,确实,这很好。因为我有一个自己的表类,它继承自ArrayList并实现了Delayed,以便添加到DelayedQueue中。在这种情况下,使用线程安全集合作为超类需要进行哪些更改? - icbytes
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接