2014-03-07 94 views
2

以下代碼在JVM中崩潰(併發修改異常),但不在DVM中,我無法理解爲什麼它不會在andorid中崩潰。我正在使用JBConcurrentModificationException不會在1個列表成員的DVM中拋出

List<String> list = new ArrayList<String>(); 
    list.add("Something");//add only 1 object 

    for(String a:list){ 
     list.remove(a); 
    } 
+0

在JVM崩潰的事實是明顯的:使用迭代器從集合中刪除元素,同時迭代它。在DVM上實現Iterator可能會有所不同。這就是說,使用一個迭代器,它將在兩個工作。 –

+0

請參閱:http://stackoverflow.com/questions/5051879/in-java-how-can-this-throw-a-concurrentmodificationexception-in-a-single-threade?rq=1 –

+0

我瞭解它的不同行爲DVM,但不明白爲什麼如此!雖然快速失敗依賴於JVM,但我仍然認爲它是基本行爲 –

回答

1

您正在遍歷列表以及試圖從相同列表中刪除值。這會導致異常。嘗試在單獨的列表中添加要刪除的項目,迭代後使用List.removeall()函數刪除所有不需要的值。

樣品:

List<String> removeList = new ArrayList<String>(); 
for(String a:list) { 
removeList.add(a); 
} 

list.removeAll(removeList); 
+0

問題完全不同。他想知道爲什麼它不會在android中崩潰? – Zeeshan

1

嗨是的,它會給作爲

Exception in thread "main" java.util.ConcurrentModificationException 
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859) 
    at java.util.ArrayList$Itr.next(ArrayList.java:831) 
    at coffee.CoffeeApp.main(CoffeeApp.java:20) 
Java Result: 1 

因爲

快速失敗行爲通過保持一個修改計數,如果迭代線程在執行一個異常修改計數的更改會拋出ConcurrentModificationException。

所以做這樣的事情,並遍歷列表與迭代器

List<String> list = new ArrayList<String>(); 
list.add("Something");//add only 1 object 

Iterator<String> it = list.iterator(); 
while(it.hasNext()) { 
    it.next(); 
    it.remove(); 
    //Do something with obj 
} 

的幫助,我們可以說是一個迭代器的快速失敗行爲不能得到保證,因爲它是,這裏的不同步併發修改在那兒。失敗快速迭代器盡最大努力拋出ConcurrentModificationException。因此,自從迭代開始以來,只要他們意識到Collection的結構已被修改,並且如果迭代器線程實現了修改,那麼快速失敗的迭代器就會失敗,然後它會拋出ConcurrentModificationException。更改可以是添加,更新或刪除。

在android中可能是在不同的實現下,所以沒有問題。

的比較研究然而請訪問:當你遍歷一個列表,我沒有有一個偉大的[R & d這裏

http://www.docjar.com/html/api/java/util/ArrayList.java.html

V/S

https://android.googlesource.com/platform/libcore/+/f33eae7e84eb6d3b0f4e86b59605bb3de73009f3/luni/src/main/java/java/util/ArrayList.java

+0

問題完全不同。他想知道爲什麼它不會在android中崩潰? – Zeeshan

+0

乾淨的迴應。 – axierjhtjz

+0

@Shaan,我要更新它,請等待,給我一分鐘! –

0

(或任何集合,就此而言),您只能通過相同的迭代器修改列表。因此,這將工作:

for(Iterator<String> listIter = list.iterator(); listIter.hasNext();) { 
    listIter.next().remove(); 
} 
相關問題