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