Можно ли синхронизировать обновление ConcurrentHashMap по его ключу? - PullRequest
2 голосов
/ 15 мая 2019

У меня есть тонны операции обновления в ConcurrentHashMap, и мне нужно минимизировать синхронизацию для обновления этой карты.

, пожалуйста, см. Код ниже.

public ConcurrentHashMap<String, Integer> dataMap = new ConcurrentHashMap<>();

    public void updateData(String key, int data) {
        if ( dataMap.containsKey(key)) {
            // do something with previous value and new value and update it
        }
    }

Например, когда один поток вызывает updateData с ключом «A», то любая другая попытка вызова updateData с ключом «A» должна быть заблокирована до завершения первого потока.Между тем, я хочу, чтобы другой поток, пытающийся вызвать updateData с ключом "B", работал одновременно.

Интересно, есть ли какой-нибудь причудливый способ заблокировать hashMap просто его ключом.

1 Ответ

1 голос
/ 15 мая 2019

Я думаю, что вы ищете метод compute .

Требуется функция, которой присваивается ключ и текущее значение (или null, если значение отсутствует).пока), и может вычислить новое значение.

ConcurrentHashMap гарантирует, что только одна такая функция запускается одновременно для данного ключа.Параллельный второй вызов будет заблокирован до готовности.

...