Да и нет. Это зависит от того, что вы делаете. ConcurrentHashMap является потокобезопасным для всех своих методов (например, получить и положить). Тем не менее, не потокобезопасен для неатомарных операций. Вот пример метода, который выполняет неатомарную операцию:
public class Foo {
Map<String, Object> map = new ConcurrentHashMap<String, Object>();
public Object getFoo(String bar) {
Object value = foo.get(bar);
if (value == null) {
value = new Object();
map.put(bar, foo);
}
return value;
}
}
Недостаток в том, что два потока могут вызывать getFoo
для получения другого объекта. Помните, что при работе с любой структурой или типом данных, даже такими простыми, как int
, неатомарные операции всегда требуют внешней синхронизации. Такие классы, как AtomicInteger и ConcurrentHashMap, помогают сделать поток некоторых общих операций безопасным, но не защищают от операций проверки-затем-установки, таких как getFoo
выше.