2012-06-19 6 views
5

fail-fast 동작에 대해 알아 보려면 java.util.HashMap으로 놀았습니다.자바 HashMap의 빠른 동작이 실패합니다

HashMap map = new HashMap(); 
map.put("jon", 10); 
map.put("sean", 11); 
map.put("jim", 12); 
map.put("stark", 13); 
map.put("vic", 14); 
Set keys = map.keySet(); 
for(Object k:keys) { 
    System.out.println(map.get(k)); 
} 

for(Object k:keys) { 
    String key =(String)k; 
    if(key.equals("stark")) { 
     map.remove(key); 
    } 
} 

System.out.println("after modifn"); 
for(Object k:keys) { 
    System.out.println(map.get(k)); 
} 

나는

12 
11 
10 
14 
13 
after modifn 
12 
11 
10 
14 

나는 또한 내가 어느 경우에 어떤 ConcurrentModificationException을하지 않았다이 반복자

Iterator<String> itr = keys.iterator(); 
while(itr.hasNext()) { 
    String key = itr.next(); 
    if(key.equals("stark")) { 
     map.remove(key); 
    } 
} 

을 ..Is 사용하여 시도 결과를 가지고 있기 때문에 (의 javadoc에서)

itera의 fail-fast 동작 토르가 그대로 보장 될 수는 없으므로 일반적으로 동기화되지 않은 동시 수정이 있는지 확인하기가 어렵습니다. 르파 반복자 내가, 당신이 ..what 생각 ConcurrentModificationException를 던질 것이라고 또 다른 thread 체크 최선 노력 원칙에 근거 해

에 ConcurrentModificationException를 던져? 당신이 보여 출력을 감안할 때

+0

'remove()'대신'clear()'를 호출 해보십시오. – Bringer128

답변

6

: 13 이후

12 
11 
10 
14 
13 // notice this? 
after modifn 
12 
11 
10 
14 

마지막 키 - 값 쌍, 당신 당신의 HashMap을 통해 Iterate 다음 마지막으로 stark 13에 해당하는 키 - 값을 제거가의 중지 IterationHashMap이 수정 된 직후에 더 이상 iterate이 아닙니다. 그래서 아니요 ConcurrentModificationException.

+0

감사합니다. 나는 결코 ... ..if (key.equals ("jon"))'예외를 throw합니다. – damon