Collections.synchronizedlist() 在从末尾迭代时删除元素[重复]

2024-01-23

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

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

我正在主线程中创建列表。并从不同的线程添加到此列表。但是,迭代和删除仅从单个计划线程完成,如下所示:-

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

上面的代码仅由单个线程执行,而多个线程正在添加到此列表中。

我想避免使用迭代器synchronized(list)因为这并不是万无一失的。


实际上,您为每个元素获取一次锁,而不是持有锁。这有比在检查时保持锁定更慢的风险。

我建议你考虑使用优先队列 https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html并进行适当的排序。这将对队列进行排序,以便您接下来要处理的任务将位于开始位置,并且无论等待任务的数量有多少,删除的成本都相对便宜。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Collections.synchronizedlist() 在从末尾迭代时删除元素[重复] 的相关文章

随机推荐