【问题标题】:Are all queues in Java thread-safe? [closed]Java中的所有队列都是线程安全的吗? [关闭]
【发布时间】:2012-12-23 15:40:52
【问题描述】:

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

注意:我使用的是 JDK 1.6。

【问题讨论】:

  • 当您阅读各个类的 Javadocs 时,究竟是什么让您对它们的措辞感到困惑?
  • 你为什么不阅读javadoc?您希望我们为您阅读并在此处发布摘要吗?
  • 从 LinkedList 文档“...请注意,此实现不同步...”中阅读文档,全部内容。
  • StackOverflow 不是文档阅读服务。每个实现的 Javadocs 都会明确地告诉你你在问什么。

标签: java concurrency thread-safety queue


【解决方案1】:

大多数标准集合都不是线程安全的。您在阅读 API 文档时会发现此信息。

例如LinkedList的文档:

如果多个线程同时访问一个链表,并且至少有一个线程在结构上修改了链表,则必须对外同步

对于从多个线程访问的集合,您应该查看java.util.concurrent

【讨论】:

    【解决方案2】:

    没有。 LinkedList 例如不是线程安全的。

    java.util.concurrent 包中的那些是线程安全的。

    最佳性能取决于您如何使用它们。而且您不会根据其性能选择实现,而是根据队列的行为方式以及您需要对队列执行的操作。例如,SynchronousQueue 的行为与 LinkedListArrayBlockingQueue 完全不同。

    【讨论】:

    • 但是当我在多个线程中修改一个非线程安全的集合,并且相应的代码部分被同步(this)包围时,这也迫使应用程序表现出线程安全,对吧?
    • 不,这还不够。所有读取访问也必须同步。队列上的所有迭代也必须同步。
    • 当然,可以说,任何被同步(this)包围的访问/变异。更好?
    • 是的,这将是线程安全的,前提是您永远不会忘记这样做。将队列封装在一个线程安全的对象中,或者从一开始就使用一个线程安全的队列将不会那么脆弱。
    • 所以,确实,这很好。因为我有一个自己的表类,它继承自 ArrayList 并实现了延迟,以便添加到延迟队列中。在这种情况下,将线程安全集合用作超类需要进行哪些更改?
    猜你喜欢
    • 1970-01-01
    • 2012-12-26
    • 2013-12-13
    • 2010-10-07
    • 2010-12-10
    • 2011-03-07
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多