2017-01-25 11 views
1

Я использую putIfAbsent для добавления значений в ConcurrentHashMap, если они еще не существуют как атомные операции.Каков правильный способ определить, изменил ли putIfAbsent ConcurrentHashMap?

Это все кажется прекрасным, но я действительно мог бы понять, был ли добавлен новый объект.

Лучшая идея заключается в том, чтобы проверить, является ли возвращаемое значение из putIfAbsent равным нулю, похоже, что оно должно работать до тех пор, пока мы никогда не ставим нулевые значения на карту (что ConcurrentHashMap не позволяет в любом случае), но я был интересно, было ли что-то, что я пропустил. Или это правильный способ сделать это?

+4

Проверка правильного значения возвращаемого значения 'putIfAbsent()'. –

+0

@SeanBright Да, это был вывод, к которому я пришел, но «return == null» казался странным способом проверить, что операция что-то сделала. –

+0

Связано: [Если вы проверяете, содержит ли карта ключ перед использованием putIfAbsent] (http://stackoverflow.com/questions/3752194/should-you-check-if-the-map-containskey-before-using-concurrentmaps-putifabsent) –

ответ

3

Лучший способ использовать CHM в этом случае, как, например:

Object o = concurrentMap.get(key); 

if(o == null){ 
    Object ret = concurrentMap.putIfAbsent(key, value); 
    if(ret == null){ 
     o = ret; 
    } 
} 
return o; 

В get вызовах без блокировки, так что вы хотите использовать Неблокирующие звонки столько, сколько вы можете. Постоянный вызов putIfAbsent может замедлить производительность, если многие вызываются.

+1

'containsKey()' будет немного читабельнее. –

+0

Но победил бы цель. Вы хотите получить значение на карте, если оно есть, и 'get()' делает это атомарно. –

+0

Если вы внимательно прочитали вопрос, OP не запрашивает возвращаемое значение, только чтобы проверить, есть ли значение. –

 Смежные вопросы

  • Нет связанных вопросов^_^