java - 需要选择更新类似 Guava 缓存的功能

标签 java caching concurrency guava semaphore

我有两个类和第三个包含 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/

相关文章:

java - 生成的 javadoc 页面不必要地用注释包装方法参数

java - Android 对话框和内存

c++ - 为什么要在levelDB的缓存中使用while循环(函数Resize)?

multithreading - 线程 : Why must all user threads be mapped to a kernel thread?

java - 如何使用selenium获取日期字段的值?

java - IntelliJ IDEA : Open test result tab only on failure

ios - 如何使用 Kingfisher 仅在磁盘中缓存图像?

ruby-on-rails - Rails 3 开发环境保持缓存,即使没有缓存?

java - 64 位 OpenJDK 7/8 中并发长写入的值完整性保证

java - 线程中断和ActionListener Java