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

mav*_*oid 5 java collections multithreading

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

pendingExecutionList = Collections.synchronizedList(new ArrayList<>(initialCapacity));
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Dim*_*rov 1

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

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

如果您想尝试一下,您可以看看 JDK 之外可用的 MPSC(多个生产者,单个消费者)队列,例如 Nitsan WakartMpscArrayQueueDisruptor