我有一个工作线程,应在ArrayList<ConcurrentLinkedQueue>上进行迭代。其他线程可以添加和删除对象(队列)。但是ArrayList不是线程安全的。使用ConcurrentLinkedQueue<ConcurrentLinkedQueue>代替ArrayList<ConcurrentLinkedQueue>是否可以?

最佳答案

如果您询问是否可以安全地迭代ConcurrentLinkedQueue,则答案为“是”。 javadoc说:


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


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

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

10-08 03:35