簡體   English   中英

如何確保在循環遍歷列表后添加的Java並發列表中的元素得到正確處理?

[英]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在該確切時間點復制列表,然后從中獲取IteratorEnumerator 如果在循環之前不進行復制,那么如果另一個線程在循環時添加了一個元素,則將獲得ConcurrentModificationException

使用同步的java.util.List將不起作用,因為一旦修改了源列表,迭代器就會變得無效。 聽起來您有生產者-消費者問題。 您應該查看一個隊列。 如果想要無限制的隊列,請嘗試java.util.Concurrent.LinkedBlockingQueue;如果想要阻塞的隊列,請嘗試java.util.concurrent.ArrayBlockingQueue。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM