簡體   English   中英

Java ArrayList並發修改

[英]Java ArrayList concurrent modification

我遇到了一些問題,無法順利完成此工作:

    for(Iterator<Object> i = mylist.iterator(); i.hasNext();) {
        Object obj = i.next();
        ArrayList<Object> newlist = new ArrayList<Object>();
        newlist.add(obj);
        i.remove();
        for(Iterator<Object> in = mylist.iterator(); in.hasNext();) {
            Object next = in.next();
            if (obj != next && (another condition)) {
                newlist.add(next);
                in.remove();
            }
        }
        if (newlist.size() > 2) anotheList.add(newlist);
        else for(Object r : newlist) {
            //mylist get back object:
            mylist.add(r);
        }
    }

我試圖找到一種優雅的方式來做到這一點,而無需越來越多地復制我的清單...

代碼當前正在執行以下操作:

  • 在外循環的第一次迭代中:
    • 刪除第一個元素。
    • 在第一個內部循環中,將所有不是'=='的其他元素都刪除到第一個元素(剛剛刪除的元素)
    • 如果我們刪除了兩個以上的元素,請將它們全部放在其他位置。
    • 否則,將元素放回列表的末尾。

顯然,這會在外部循環的第二次迭代時發生並發修改,因為內部循環已修改了要在外部循環中迭代的集合。 你不能那樣做。

但是,更重要的是,該算法沒有多大意義。 在我看來,這很可能意味着該代碼沒有按照您的意圖進行操作。 除非你解釋一下你實際上是試圖實現的,我們不能找出真正的問題是什么,以及如何解決它。


我仍然不確定您要達到的目標,但我認為解決方案將涉及以下一項或兩項:

  • 更改實現類的myList確實允許並發修改並發集合類之一; 例如ConcurrentLinkedDeque

  • 以此替換外部循環:

     while (!myList.isEmpty()) { Object obj = myList.remove(0); ... } 

如果在第一個內部循環運行時沒有其他修改列表的情況,則后一種補救方法將擺脫ConcurrentModificationException 第一種補救措施完全擺脫了ConcurrentModificationException ,但不能保證第一個內部循環將看到在其他位置添加的元素。

在這兩種情況下,如果在處理條目方面都沒有任何進展,則必須擔心如何終止循環。

“大O”復雜度也是一個問題,但是如果不了解“其他條件”在做什么,就無法表征。

我假設您收到一個ConcurrentModificationException。

當第二個迭代器在其上進行迭代時,您將無法在迭代器中修改列表。

http://download.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html

暫無
暫無

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

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