你得到ConcurrentModificationException
因爲ArrayList
的迭代器是快速失敗的設計。這意味着一旦迭代器被創建,如果ArrayList
是被修改(添加或刪除元素),它將拋出ConcurrentModificationException
。
如果檢查異常日誌聲明,它是在線路String s=itr.next();
通過itr.next()
方法,因爲通過使用modCount
變量,它的副本,同時創造從列表迭代器調用的ArrayList
大小的checkForComodification()
方法迭代器檢查修飾next()
方法拋出。
現在讓我們說說CopyOnWriteArrayList
,你沒有得到這個例外是因爲CopyOnWriteArrayList
是線程安全的變體光盤的ArrayList
,其中所有可變操作,比如添加,刪除,設置通過內部陣列複製到新的實現一個用新創建的數組替換舊的數組。
所以,當你從列表中獲得迭代器時,它將保存一個數組的引用,並且當你添加一個元素到列表中時,這個列表就會有全新的數組。迭代器仍然指向舊數組。
您可能已經注意到,聲明l.add("d");
中新添加的元素未打印在控制檯上。但如果你打印整個清單,它就在那裏。
這裏是您的示例代碼CopyOnWriteArrayList
:
List<String> l = new CopyOnWriteArrayList<>();
l.add("a");
l.add("b");
l.add("c");
Iterator<String> itr = l.iterator();
l.add("d");
while (itr.hasNext()) {
String s = itr.next();
System.out.println(s);
}
System.out.println(l);
輸出是農產品是:
a
b
c
[a, b, c, d]
希望這有助於。 享受:)
我已經做了...「併發收集」 –
如果您將鼠標懸停在它上面,則說明這是.Net概念,而不是JVM。你得到這個異常的原因是因爲在你已經獲得一個迭代器之後你正在改變這個集合(AL) - 這裏涉及到多少個線程並不重要。 – StuartLC
我改變了標籤..didnt通知,因爲它顯示.net的概念.. –