Я использую ConcurrentMap Java для карты, которая может использоваться из нескольких потоков. PutIfAbsent - отличный метод и гораздо легче читать/писать, чем использовать стандартные операции с картами. У меня есть некоторый код, который выглядит следующим образом:Если вы проверяете, содержит ли mapKey перед использованием ConcurrentMap's putIfAbsent
ConcurrentMap<String, Set<X>> map = new ConcurrentHashMap<String, Set<X>>();
// ...
map.putIfAbsent(name, new HashSet<X>());
map.get(name).add(Y);
читаемости мудрым это является большим, но это не потребуется создать новую HashSet каждый раз, даже если он уже есть в карте. Я мог бы написать это:
if (!map.containsKey(name)) {
map.putIfAbsent(name, new HashSet<X>());
}
map.get(name).add(Y);
С этим изменением он теряет немного читаемости, но не нужно создавать HashSet каждый раз. Что лучше в этом случае? Я склоняюсь к первому, поскольку он более читабельен. Второй будет работать лучше и может быть более правильным. Возможно, есть лучший способ сделать это, чем любой из них.
Какова наилучшая практика использования putIfAbsent таким образом?
В вашем примере, Value-HashSet должен был бы быть ConcurrentHashSet тоже, иначе это еще не поточно. –
Решение Tom Hawtin - это именно то, что вы ищете –
Как указал Маркус, тип значения (набор в этом случае) также должен быть потокобезопасным, так как к нему могут одновременно обращаться несколько потоков. – sjlee