[英]How to make sure elements of a concurrent list in java, that are added after the list has been looped through, are handled properly?
我有一個並發對象列表。 多個線程添加到該列表。 在某個時候,我遍歷此列表並對列表元素執行操作。 如何確保在遍歷列表時處理添加的元素?
主線程:
List<Object> someList = Collections.synchronizedList(new ArrayList<Object>());
for(Object o : someList){
o.toString();
}
其他一些線程:
getSomeList().add(new Object());
注意:我想在開始遍歷列表之后(或之后)處理對象。
在線程B遍歷列表時,能夠在線程A中添加元素的唯一方法是使線程B在該確切時間點復制列表,然后從中獲取Iterator
或Enumerator
。 如果在循環之前不進行復制,那么如果另一個線程在循環時添加了一個元素,則將獲得ConcurrentModificationException
。
使用同步的java.util.List將不起作用,因為一旦修改了源列表,迭代器就會變得無效。 聽起來您有生產者-消費者問題。 您應該查看一個隊列。 如果想要無限制的隊列,請嘗試java.util.Concurrent.LinkedBlockingQueue;如果想要阻塞的隊列,請嘗試java.util.concurrent.ArrayBlockingQueue。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.