Collections.synchronizedlist()从end 迭代时删除元素

我正在使用Collections.Synchronizedlist()来使我的arraylist线程安全。 我想问的是以下代码线程安全,即从末尾迭代列表时删除: –

 pendingExecutionList = Collections.synchronizedList(new ArrayList(initialCapacity)); 

我在主线程中创建列表。 并从不同的线程添加到此列表。 但是,迭代和删除只能从一个Scheduled线程完成,如下所示: –

 for (int i = pendingExecutionList.size() - 1; i >= 0; i--) { if (someCondition(pendingExecutionList.get(i))) { process(pendingExecutionList.remove(i)); } } 

当多个线程添加到此列表时,上述代码仅由单个线程执行。

我想避免在synchronized(list)使用迭代器,因为它不是故障安全的。

如果我正确理解您的工作流管道,我建议尝试使用BlockingQueue一些变体而不是synchronizedList()

ArrayBlockingQueue允许你公平地安排执行,并且应该保持多个生产者的缓存相当热(除非你的生产者开始超越缓存预取器,在这种情况下你会遇到错误的共享)。

如果您有进行实验的心情,可以查看JDK之外的MPSC(多个生产者,单个消费者)队列,如Nitsan Wakart的MpscArrayQueue或Disruptor 。

而是持有锁,实际上每个元素获得一次锁定。 在您进行检查时,这可能比仅仅握住锁更慢。

我建议您考虑使用具有适当排序的PriorityQueue 。 这将对队列进行排序,以便您接下来要处理的队列将在开始时,无论等待任务的数量如何,移除的成本都相对便宜。