This question already has answers here:
Collections.synchronizedList and synchronized

(6个答案)


5年前关闭。




我正在使用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

关于java - Collections.synchronizedlist()从结尾迭代时删除元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36688387/

10-10 12:28