【问题标题】:Java ConcurrentLinkedQueue instead of List?Java ConcurrentLinkedQueue 而不是 List?
【发布时间】:2016-04-13 22:16:09
【问题描述】:

我有一个工作线程应该遍历ArrayList<ConcurrentLinkedQueue>。其他线程可以添加和删除对象(队列)。但是 ArrayList 不是线程安全的。使用ConcurrentLinkedQueue<ConcurrentLinkedQueue> 代替ArrayList<ConcurrentLinkedQueue> 可以吗?

【问题讨论】:

  • List 是一个接口。有些实现是线程安全的(例如CopyOnWriteArrayList),有些则不是(例如ArrayList)。
  • 有什么区别?为什么 ConcurrentLinkedQueue 不起作用或为什么不好?
  • 我认为这取决于您需要做什么。我会提供有关您的要求的更多详细信息。
  • 基本上我所做的所有事情都在问题中说了出来。有一个线程不断迭代 List,其他线程可以添加和删除对象。

标签: java list concurrency thread-safety queue


【解决方案1】:

如果您问是否可以安全地迭代ConcurrentLinkedQueue,那么答案是肯定的。 javadoc 说:

Iterators 是弱一致的,返回的元素反映了在迭代器创建时或之后的某个时刻队列的状态。 它们不会抛出ConcurrentModificationException,并且可以与其他操作同时进行。 自迭代器创建以来队列中包含的元素将仅返回一次。

但是,您可以在 List 上执行某些您无法在 Queue 上执行的操作(例如位置获取/设置、插入/删除任意元素。)如果您的应用程序需要执行这些操作或类似,然后使用ConcurrentLinkedQueue 代替ArrayList 将不起作用。

另外,请注意 ConcurrentLinkedQueue.size()O(N) 操作!

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2011-04-15
    • 2013-10-28
    • 1970-01-01
    • 2022-07-11
    相关资源
    最近更新 更多