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