2013-05-15 5 views
3

그래서 최근에 FindBug를 발견했지만, 두 곳에서 내가 뭘하는지 모르겠다 고 생각하게 만듭니다. 이것은 내가 반복을 동기화 할 필요가 있다고 생각, 또는이 FindBug가 필요의 실현만큼 똑똑하지 않는 경우입니다FindBug에서이 동시 맵이 동기화 될 필요가 없다고 말합니다.

private Map<String, Object> map = new ConcurrentHashMap<String, Object>(); 

public void method1(){ 
    synchronized(map){ // FindBug says this is unnecessary 
     for (String keys: map.keySet()){ 
      ... 
     } 
    }   
} 

그들 중 하나인가? 나는 단지 확인하고 싶다!

+0

http://stackoverflow.com/questions/3768554/is-iterating-concurrenthashmap-values-thread-safe – Thihara

답변

3

의 반복자는 "weakly consistent"입니다. 즉, 반복자가 작성되었을 때의 맵 상태를 반영하지만 반복자 작성 후 맵에 대한 수정 사항은 반영하지 않을 수 있습니다. 즉, 이터레이터는 ConcurrentModificationException,을 던지지 않으므로 기본 맵을 잠그지 않아도됩니다.

+0

잠금을 사용하면 반복하는 동안 요소가 추가되거나 제거되지 않습니다. –

+0

SHM의 이점 중 일부를 무효화하는 반복 중에 블록을 차단하려면 맵에 대한 모든 쓰기를 동기화해야합니다. –

+1

"잠금 기능을 사용하면 반복하는 동안 요소가 추가되거나 제거되지 않습니다." _ 아니오, 그렇지 않습니다. _ 아무것도하지 않습니다. _ –