This question already has answers here:
Collections.synchronizedList and synchronized
(6个答案)
5年前关闭。
我正在使用
我正在主线程中创建列表。并从不同的线程添加到此列表。但是,仅从单个Scheduled线程进行迭代和删除,如下所示:-
上面的代码仅由一个线程执行,而多个线程正在添加到此列表中。
我想避免在
(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