Я пытаюсь увеличить значение для ConcurrentHashMap - PullRequest
0 голосов
/ 11 апреля 2019

Все с многопоточным программированием и без гуавы. Моя проблема такая же, как эта , но я хочу решить ее без break;. Я уже читал эту тему, но все еще не решил проблему, я новорожденный в многопоточном, так что, возможно, решение здесь, но я не вижу его.

Я пытаюсь считать слова. Если это слово уже встречалось, просто увеличьте значение, если нет, просто поместите новый узел в карту с ключами word и value 1.

Это мой код, и он неверный. Я хочу избежать каких-либо петель.

String word = m.group();
if(wordMap.putIfAbsent(word, 1) == null){
    Integer old;
    while (!wordMap.replace(word, old = wordMap.get(word), old + 1));
}

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Метод слияния - это то, что вы, скорее всего, ищете:

String word = m.group();
wordMap.merge(word, 1, Integer::sum);
1 голос
/ 11 апреля 2019

Решение, указанное в ссылке , которую вы цитировали ранее, уже имеет оптимальное решение.

Вы можете использовать функции Java 8 computeIfPresent () и putIfAbsent (), поскольку они обрабатывают параллелизм. ConcurrentMap обеспечивает согласованность памяти при выполнении операций ключ / значение в многопоточной среде.

В соответствии с документацией , операция обновления для данного ключа имеет отношение «происходит до» с любым (не нулевым) поиском для этого ключа, сообщающего об обновленном значении.

...