因此,它不会更新键的值。这样对吗?
那是正确的。它将返回地图中已经存在的当前值。
这对于添加和更新缓存会更好吗?
有几件事可以使您的实现更好。
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; }}


