2013-05-15 1 views
3

Итак, я недавно обнаружил 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()){ 
      ... 
     } 
    }   
} 

Я подумал, что мне нужно синхронизировать итерации, или это случай FindBug не достаточно умен, чтобы понять, что это необходимо? Я просто хочу убедиться!

+0

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

ответ

3

Итераторы для ConcurrentHashMap «слабо согласованы», что означает, что они отражают состояние карты в момент создания итератора, но не могут отражать изменения, внесенные в карту после создания итератора; другими словами, итератор не собирается бросать ConcurrentModificationException,, поэтому вам, вероятно, не нужно блокировать базовую карту.

+0

Но не блокирует ли предотвращение добавления или удаления элементов во время моей итерации? –

+0

Вам нужно будет синхронизировать любые записи с картой, чтобы заблокировать их во время итерации, которая побеждает часть преимущества SHM. –

+1

«Но разве блокировка препятствует добавлению или удалению элементов во время моей итерации?» _Нет, это doesn't._ Он делает _nothing._ –