我有两个类和第三个包含guava缓存对象的单例类。我在A类中使用此缓存来执行get(key)并在调用时递增,并以3000 /分钟的速率调用它。有一个类B使用get(key)将此值添加到db并将0放在键上。如果A和B一次读取相同的值,则可能导致问题。 例如,如果key的值为12,则读取12,B设置为0,然后A再次将其设置为13。 请建议做什么。
答案 0 :(得分:1)
使用
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.地图视图为ConcurrentMap
,用于锁定密钥上的计算。
你可能根本不需要缓存。考虑使用ConcurrentHashMap
,AtomicLongMap
或(正如Xaerxess所说)ConcurrentHashMultiset(最后选择可能是最佳选择,因为多重数字用于计数)。