Как использовать ConcurrentHashMap.merge () с общим AtomicInteger - PullRequest
0 голосов
/ 29 мая 2019

У меня есть общий глобальный счетчик, который я хочу проверить меньше, чем общее, прежде чем выполнять параллельные вычисления и обновлять карту. Как я могу использовать современные утилиты / API Java для параллелизма, чтобы убедиться, что это атомарно?


class SharedAccess {

    AtomicInteger globalCounter = new AtomicInterger();
    Map<String, Integer> counterPerKey = new ConcurrentHashMap<>()

    class Holder{
        Integer value
    }

    public Holder incrementForKeyMultipleThreads(String key) {
         if (total.get() < 1000) {

          Integer newTotal = counterPerKey.merge(key, 1, Integer::sum);
          globalCounter.increment();
         return new Holder(newTotal);

    }

  }

}

1 Ответ

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

Современная Java по-прежнему использует те же основные принципы безопасности потоков.У вас есть сценарий check-then-act , который охватывает практически весь метод.Таким образом, вы можете сделать метод synchronized:

public synchronized Holder incrementForKeyMultipleThreads(String key) {
    if (globalCounter.get() < 1000) {
        globalCounter.increment();
        return new Holder(counterPerKey.merge(key, 1, Integer::sum));
    }
    return null;
}

И затем, если это единственное место, которое вы используете (чтение или запись) globalCounter, вы можете изменить его на int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...