gpt4 book ai didi

java - 在这种情况下如何处理并发?

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:10:05 27 4
gpt4 key购买 nike

我有一个哈希表

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 相同时才同步。

我可以做一些可以在并发方面获得更好性能的事情吗?(我知道 ConcurrentHashMap 和 synchronize 在这里有点多余,但让我们关注一下是否只能在 key 相同时同步)

最佳答案

ConcurrentHashMap 的全部意义在于促进并发操作。以下是无需显式同步即可执行原子更新的方法:

private Integer somefunction() {
Integer oldOrder;
// Insert key if it isn't already present.
oldOrder = count.putIfAbsent(key, 1);
if (oldOrder == null) {
return 0;
}
// If we get here, oldOrder holds the previous value.
// Atomically update it.
while (!count.replace(key, oldOrder, oldOrder + 1)) {
oldOrder = count.get(key);
}
return oldOrder;
}

请参阅 putIfAbsent() 的 Javadocs和 replace()了解详情。

作为Tagir Valeev指出in his answer , 你可以使用 merge()相反,如果您使用的是 Java 8,这会将上面的代码缩短为:

private Integer somefunction() {
return count.merge(key, 1, Integer::sum) - 1;
}

另一种选择是将值设置为 AtomicInteger反而。参见 hemant1900's answer了解如何操作。

关于java - 在这种情况下如何处理并发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32111179/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com