gpt4 book ai didi

java - ConcurrentHashMap 作为缓存

转载 作者:行者123 更新时间:2023-11-29 05:39:02 25 4
gpt4 key购买 nike

如果将 ConcurrentHashMap 用作 map 我问自己实现线程安全的正确方法是什么?

在一本书中我发现了这样的东西:

private ConcurrentHashMap<KEY, VALUE> cache = new ConcurrentHashMap<>();

public V put(KEY key, VALUE value) {
VALUE ret = cache.get(key);
if (ret == null) {
ret = cache.putIfAbsent(key, value);
if (ret == null) {
ret = value;
}
}
return ret;
}

现在我问自己是否有必要像这样使 get 和 possible put 成为原子:

public V put(KEY key, VALUE value) {
synchronized(cache) {
VALUE ret = cache.get(key);
if (ret == null) {
ret = cache.putIfAbsent(key, value);
if (ret == null) {
ret = value;
}
}
}
return ret;
}

因为当 cache.get() 返回 null 时,另一个线程可能会使第一个线程的 cache.get() 结果无效?

干杯奥利弗

最佳答案

没有必要。

确实,由于 cache.get() 可能会被另一个线程无效,因此以下代码不是线程安全的。

VALUE ret = cache.get(key);
if (ret == null) {...}

但是,代码只是为了优化(原子操作更昂贵)。原子性由 map.putIfAbsent() 确保,它是原子的,因此是线程安全的。然而,如果 cache.get() 返回其他东西然后 null,昂贵的原子操作不会执行。

关于java - ConcurrentHashMap 作为缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18360368/

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