【发布时间】:2015-08-20 06:40:46
【问题描述】:
我有一个 HashMap
ConcurrentHashMap<String, Integer> count =new ConcurrentHashMap<String, Integer>();
我会这样使用:
private Integer somefunction(){
Integer order;
synchronized (this) {
if (count.containsKey(key)) {
order = count.get(key);
count.put(key, order + 1);
} else {
order = 0;
count.put(key, order + 1);
}
}
return order;
}
但是正如你所看到的,这对于处理并发可能并不理想,因为只有同一个 key 下的 value 可能会相互干扰。不同的 key 不会相互干扰,所以不需要同步所有操作。我只想在密钥相同的情况下进行同步。
我可以做一些可以实现更好的并发性能的事情吗? (我知道 ConcurrentHashMap 和 synchronize 在这里有点多余,但让我们关注我们是否只能在 key 相同时进行同步)
【问题讨论】:
-
你能解释一下你想要达到的目标吗?
-
不同键互不干扰,不需要同步所有操作。我只想在密钥相同时进行同步。
-
看起来您想要的算法是“如果地图中不存在键,则将其插入顺序值为 1,并返回 0。如果该项目存在于地图中,则增加其顺序值,并返回增量前的值。”这是正确的吗?
-
正是我想做的事
标签: java multithreading concurrency hashmap java.util.concurrent