一尘不染

ConcurrentHashMap put vs putIfAbsent

java

Java
Docs表示,putIfAbsent相当于

   if (!map.containsKey(key)) 
      return map.put(key, value);
   else
      return map.get(key);

因此,如果键存在于地图中,则不会更新其值。这样对吗?

如果我想根据某些条件更新键值怎么办?说出到期时间等

添加和更新缓存会更好吗?

public void AddToCache(T key, V value)
{
   V local = _cache.putifabsent(key, value);

   if(local.equals(value) && local.IsExpired() == false){
     return;
   }
   // this is for updating the cache with a new value
   _cache.put(key, value);
}

阅读 271

收藏
2020-12-03

共1个答案

一尘不染

因此,它不会更新键的值。这样对吗?

那是正确的。它将返回地图中已经存在的当前值。

这对于添加和更新缓存会更好吗?

有几件事可以使您的实现更好。

1.
您不应该使用putIfAbsent来测试它是否存在,只有在要确保then不存在时才应使用它putIfAbsent。相反,您应该使用map.get它来测试它的存在(或map.contains)。

    V local = _cache.get(key);
    if (local.equals(value) && !local.IsExpired()) {
        return;
    }

2.
您将要替换而不是put,这是因为可能发生竞争情况,其中if两个或多个线程可以将其评估为false,其中两个(或多个)线程中的一个将覆盖另一个线程的puts。

你可以做的反而是取代

说完一切后,它看起来可能像这样

public void AddToCache(T key, V value) {
    for (;;) {

        V local = _cache.get(key);
        if(local == null){
            local = _cache.putIfAbsent(key, value);
            if(local == null)
                return;
        }
        if (local.equals(value) && !local.IsExpired()) {
            return;
        }

        if (_cache.replace(key, local, value))
            return;
    }
}
2020-12-03