Если вы не синхронизируете весь блок кода, который выполняет обновление, оно все равно не будет работать так, как вы ожидаете.
Синхронизированная карта просто гарантирует, что ничего страшного не произойдет, если вы позвоните, скажем, put
несколько раз одновременно Это не гарантирует, что
myMap.put("username", myMap.get("username") + 1);
выполняется атомарно.
Вы должны действительно синхронизировать весь блок, который выполняет обновление. Либо с использованием некоторого Semaphore
, либо с помощью ключевого слова synchronized
. Например:
final Object lock = new Object();
...
synchronized(lock) {
if (!myMap.containsKey(username))
myMap.put(username, 0);
myMap.put(username, myMap.get(username) + 1);
if (myMap.get(username) >= THRESHOLD) {
// possible brute force detected! alert admin / slow down login
}
}