2014-03-07 2 views
2

다음 코드는 JVM에서 충돌하지만 (동시 수정 예외) DVM에서는 작동하지 않습니다. 왜 안드로이드에서 충돌이 발생하지 않는지 이해할 수 없습니다. 나는 JB를 사용 중입니다DVM에서 ConcurrentModificationException이 throw되지 않았습니다.

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

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

사실 JVM에서 충돌이 있음을 분명히 알 수 있습니다. 반복기를 사용하여 반복에서 컬렉션에서 요소를 제거 할 수 있습니다. Iterator의 구현은 DVM에서 다를 수 있습니다. 즉, 반복기를 사용하면 두 가지 모두에서 작동합니다. –

+0

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

+0

DVM, 그러나 didnt는 왜 그렇게 이해한다! fail-fast는 JVM에 의존적이지만 여전히 기본 동작이 될 것으로 기대했습니다. –

답변

1

같은 목록에서 값을 삭제하려고하는 것은 물론 목록을 반복하고 있습니다. 이로 인해 예외가 발생합니다. 제거 할 항목을 별도의 목록에 추가하고 반복 후 List.removeall() 함수를 사용하여 원하지 않는 모든 값을 제거하십시오.

샘플 :

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

list.removeAll(removeList); 
+0

질문은 완전히 다릅니다. 그는 왜 안드로이드에 충돌하지 않는지 알고 싶습니까? – 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가 Throw됩니다.

그래서 우리가 말할 수있는 것은 반복자의 fail-fast의 동작은 그것이 여기서, 비동기의 동시 변경이 그대로 보장 할 수 없다 이런 식으로 뭔가를하고 반복자

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 
} 

의 도움으로 목록을 반복 거기에있다. Fail-fast iterator는 최선 노력 (best-effort) 기준으로 ConcurrentModificationException을 던집니다. 따라서 반복 속도가 시작된 이후 Collection의 구조가 수정되고 iterator 스레드가 수정을 실현하면 ConcurrentModificationException이 throw되는 즉시 fail-fast 반복자가 실패합니다. 변경 사항은 추가, 갱신 또는 삭제 일 수 있습니다.

안드로이드에서는 다른 구현에 따라 문제가 없을 수 있습니다. 당신이 목록을 통해 반복하는 동안 비교 연구를위한

그러나 방문은 내가 훌륭한 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

질문은 완전히 다릅니다. 그는 왜 안드로이드에 충돌하지 않는지 알고 싶습니까? – Zeeshan

+0

깨끗한 응답. – axierjhtjz

+0

@Shaan, 나는 그것을 잠시 기다려주십시오. 잠시만 기다려주세요. –

0

있었다하지 않았다 (또는 임의의 콜렉션), 매우 동일한 반복자를 통해서만리스트를 수정할 수 있습니다. 그러면 작동합니다 :

for(Iterator<String> listIter = list.iterator(); listIter.hasNext();) { 
    listIter.next().remove(); 
} 
관련 문제