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