2013-09-30 82 views
0

當我們在程序上面運行時,只要修改了ArrayList就會得到java.util.ConcurrentModificationException。發生這種情況是因爲ArrayList迭代器在設計上是快速失效的。這意味着一旦創建了迭代器,如果修改了ArrayList,則會拋出ConcurrentModificationExceptionCopyOnArrayList併發修改

public class ConcurrentListExample { 

    public void someMethod() { 
     List<String> list = new ArrayList<>(); 
     list.add("1"); 
     list.add("2"); 
     list.add("3"); 
     list.add("4"); 
     list.add("5"); 

     // get the iterator 
     Iterator<String> it = list.iterator(); 

     //manipulate list while iterating 
     while (it.hasNext()) { 
      String str = it.next(); 
      System.out.println(str); 
      if (str.equals("2")) { 
       list.remove("5"); 
      } 
      if (str.equals("3")) { 
       list.add("3 found"); 
      } 
      if(str.equals("4")) { 
       list.set(1, "4"); 
      } 
     } 
    } 
} 

,但如果我們採取Employee類:

public class Test { 
    public static void main(String[] args) { 
     List al = new ArrayList(); 
     Employee ee = new Employee(1, "anoj"); 
     Employee ee1 = new Employee(2, "hai"); 
     al.add(ee); 
     al.add(ee1); 
     Iterator it = al.iterator(); 
     while (it.hasNext()) { 
      Employee hh = (Employee)it.next(); 
      if (hh.getName().equals("anoj")) { 
       al.remove(0); 
       System.out.println(al); 
      } 
     } 
    } 
} 

我沒有得到一個ConcurrentModificationException

+0

其正確的「你應該添加或刪除的對象,而迭代。 – Sarma

+0

能否請您修正格式?很難看到發生了什麼事情在這個代碼。在第一個塊,請降低縮進級別,使其不揚長而去屏幕的右側。而在第二塊,請加縮進合適的。這將使人們更容易閱讀你的問題,並給出答案。 – yshavit

+3

什麼是真正的問題在這裏? –

回答

2

您不能使用迭代器同時修改和打印操作。它支持add()remove()

0

您應該通過迭代器添加或刪除。

+1

它。刪除()我得到java.lang.IllegalStateException – user2832497

1

它不會失敗的第二次因爲iterator回報anoj最後。因此hasNext返回false,並且next從不被調用,因此沒有ConcurrentModificationException

只需將加入ee1上述ee,它會失敗

注意這是內部實施ArrayList爲1.爲什麼anoj最後被退回並2.爲什麼hasNext犯規扔CME。

+0

謝謝好exaplain – user2832497

1

併發修改異常氣體檢查缺陷,如果你刪除ArrayList的倒數第二個元素它不會抱怨,但會跳過最後一個條目。

發生這種情況是因爲它在檢查併發修改之前檢查它是否已經迭代了size()次。

+0

感謝非常有幫助。 – user2832497

0

我認爲正確的解釋是,從日javadocs of ConcurrentModificationExcetion這種提取物:

注意,快速失敗行爲不能得到保證,因爲它是一般 來說,不可能作出任何硬性保證的 存在非同步併發修改。盡力而爲,快速失敗操作拋出 ConcurrentModificationException。因此, 將是錯誤的編寫依賴於此異常 其正確性的程序:ConcurrentModificationException的應該只是 檢測錯誤。

+0

確定可以爲您提供鏈接。 – user2832497

+0

是的,我已經更新了該鏈接的答案。抱歉,我應該這麼做過。 – Sage