Hashtable и Collections.synchronizedMap являются потокобезопасными, но все же составными операциями, такими как
if (!map_obj.containsKey(key)) {
map_obj.put(key, value);
}
требуется внешняя синхронизация как:
synchronized(map_obj) {
if (!map_obj.containsKey(key)) {
map_obj.put(key, value);
}
}
Предположим, у нас есть ConcurrentHashMap(CHM) вместо Hashtable или HashMap. CHM предоставляет альтернативный метод putIfAbsent()
для вышеуказанной составной операции, что устраняет необходимость во внешней синхронизации.
Но предположим, что CHM не предоставляет putIfAbsent()
. Тогда мы можем написать следующий код:
synchronized(concurrenthashmap_obj) {
if (!concurrenthashmap_obj.containsKey(key)) {
concurrenthashmap_obj.put(key, value);
}
}
Я имею в виду, можем ли мы использовать внешнюю синхронизацию на объекте CHM? Будет ли это работать?
Для вышеописанной составной операции в CHM есть метод putIfAbsent()
, но как мы можем добиться безопасности потоков для других составных операций, если мы используем CHM. Я имею в виду, можем ли мы использовать внешнюю синхронизацию на объекте CHM?
ConcurrentHashMap
, чтобы все заработало. 09.02.2014