具有值增量的Map的HashMap同步

Mar*_*o B 4 java synchronization synchronized

我有关于HashMap同步的问题.背景是我试图实现一种简单的暴力检测方法.我将使用一个用户名作为密钥的地图,用于保存用户登录尝试失败的次数.如果登录失败,我想做这样的事情:

    Integer failedAmount = myMap.get("username");
    if (failedAmount == null) {
        myMap.put("username", 1);
    } else {
        failedAmount++;
        if (failedAmount >= THRESHOLD) {
            // possible brute force detected! alert admin / slow down login
            // / or whatever
        }
        myMap.put("username", failedAmount);
    }
Run Code Online (Sandbox Code Playgroud)

我现在想到的机制非常简单:我只会跟踪这一整天并在午夜清除()HashMap或类似的东西.

所以我的问题是:我可以使用的最佳/最快的Map实现是什么?我需要一个完全同步的Map(Collections.sychronizedMap())还是一个ConcurrentHashMap足够?或者甚至只是一个普通的HashMap?我想如果一些增量减少的话,这不是什么大问题吗?

nwi*_*ler 5

我会使用ConcurrentHashMapAtomicInteger http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html的组合.

使用AtomicInteger不会帮助你进行比较,但它可以帮助你保持数字准确 - 不需要执行++和分两步.

ConcurrentHashMap,我会使用这个putIfAbsent方法,这将消除你的第一个if条件.

AtomicInteger failedAmount = new AtomicInteger(0);

failedAmount = myMap.putIfAbsent("username", failedAmount);

if (failedAmount.incrementAndGet() >= THRESHOLD) {
    // possible brute force detected! alert admin / slow down login
    // / or whatever
}
Run Code Online (Sandbox Code Playgroud)