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?我想如果一些增量减少的话,这不是什么大问题吗?
我会使用ConcurrentHashMap和AtomicInteger 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)
| 归档时间: |
|
| 查看次数: |
370 次 |
| 最近记录: |