User есть AtomicInteger referenceCounter.
Каждый раз я достаю пользователя с помощью метода compute и увеличиваю referenceCounter на 1.
В конце метода я еще раз вызываю compute и на этот раз уменьшаю referenceCounter. Если referenceCounter == 0 и при этом выполняется еще некоторое дополнительное условие, то я удаляю этого пользователя из мапы.
Теперь вопросы:
1. Если я читаю/пишу referenceCounter только из одной и той же ConcurrentHashMap, могу ли я использовать int для referenceCounter вместо AtomicInteger? ConcurrentHashMap же все сама синхронизирует.
2. Как более правильно реализовать конкурентные вставки/удаления из ConcurrentHashMap?
3. Где вообще можно посмотреть более сложные примеры использования конкурентных структур?
Спасибо.
Update: буду смотреть в сторону Guava Striped<Lock>, подходит для моей задачи.
1) ну конечно же нет, у вас же конкурентная мапа не просто так, да? Значит вот эта свистопляска с помпьютами и +-1 происходит из нескольких потоков, верно? Ну и ответ, вроде, очевиден почему нельзя обновлять int из нескольких потоков 2) ну вот методы из 8ки compute, computeIfAbsent, putIfAbsent, etc - это, самый удобный способ, во всяком случае тут за вас решили максимальное количество проблем многопоточности, единственное что от вас требуется - это написать либо чистую функцию, которая вычисляет значение, либо корректно синхронизировать доступ к каким-нибудь внешним объектам, коллекциям. 3) хз, но я думаю самое главное при работе с такими вещами - это понимание hb и контрактов коллекции. Вы же в курсе что в джаве тоже есть https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/StampedLock.html ?
Обсуждают сегодня