2

현재 코드는 for-each Java 5 루프를 사용하여 ConcurrentHashMap을 반복합니다. 아래의 코드에서 암시 적 반복자는 오류 방지이므로 ConcurrentModificationException을 실행하지 않습니다.ConcurrentHashmap 반복하기

Map<Long,String> map = new ConcurrentHashMap <Long,String>(); 
map.put(1L, "1"); 
map.put(2L, "2"); 
System.out.println("map size before" + map.size()); 
for (Long id : map.keySet()) { 
    map.remove(id); 
} 
System.out.println("map size after" + map.size()); 

내가는, Iterator.remove()

답변

4

를 명시 적 반복자를 사용하고 실행하는 코드를 변경해야하는 이유에 관해서는 어떤 이유로 내가 코드를 변경해야하는 이유에 관해서는 어떤 이유가 있나요인가 는, Iterator.remove() 내부적으로

, CHM 통화 map.remove(key) 자체를 사용하는 반복자를 명시 적 반복자를 사용하여 실행합니다. 아래 코드를 참조하십시오.

즉 반복기에서 제거하는 것이 적절한 패턴이며 가능하면 일반적인 패턴을 항상 사용하는 것이 좋습니다. 예를 들어, 다른 맵을 사용하도록 코드를 복사하거나이 코드의 맵을 CHM이 아닌 것으로 다운 그레이드하면 이터레이터를 사용하는 경우 코드가 손상되지 않습니다.

abstract class HashIterator { 
    ... 
    public void remove() { 
     if (lastReturned == null) 
      throw new IllegalStateException(); 
     ConcurrentHashMap.this.remove(lastReturned.key); 
     lastReturned = null; 
    } 
+1

코드가 이미 제작 중이며 불행히도 변경할 수 없습니다. 내가 반복자 패턴을 사용했으면 좋겠다. – Noosphere

0

안전 반복자 실패 인이 제공하는 동시성 기능 이외의 concurrenthmp에 대한주의하는 것이 하나의 매우 중요한 기능 있습니다. 반복하면서 entryset - put/remove를 편집 할 수 있습니다.