2012-06-19 5 views
5

fail-fastの動作を確認するためにjava.util.HashMapと遊んでいました。java 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のフェイル・ファーストの動作一般的に言えば、同期していない同時変更が存在するかどうかの確かな保証は不可能です。フェイルファスト イテレータは、私は、それはあなたが..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に対応するキーと値を削除するには、停止しますHashMapの直後にIterationが変更されたため、これ以上iterateにはなりません。だからいいえConcurrentModificationException.

+0

ありがとう..私は気づいたことはありません...(key.equals( "jon")) '例外をスローします.. – damon

関連する問題