我有两个类和第三个包含 Guava 缓存对象的单例类。我在 A 类中使用这个缓存来执行 get(key) 并在调用时递增,并且调用速度为 3000/分钟。有一个 B 类使用 get(key) 将此值添加到 db 中,并在该键上添加 0。如果 A 和 B 同时读取相同的值,可能会导致问题。 例如,如果键的值为 12,则两者都读取 12,B 设置为 0,然后 A 再次将其设置为 13。 请建议该怎么做。
最佳答案
使用
cache.asMap().compute(key, (k, v) -> v==null ? 1 : v+1)
对于 A 和
int[] result = {0};
cache.asMap().computeIfPresent(key, (k, v) -> {
result[0] = v;
return 0; // or null if you want to remove the entry
});
对于B来说, map View 是ConcurrentMap
,它锁定了key上的计算。
您可能根本不需要缓存。考虑使用 ConcurrentHashMap、AtomicLongMap 或(如 Xaerxess 指出的)ConcurrentHashMultiset (最后一个选择可能是最好的,因为多重集用于计数)。
关于java - 需要选择更新类似 Guava 缓存的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47581749/