java - 使用 java ConcurrentHashMap 实现缓存

标签 java concurrency concurrenthashmap

我想在 Web Java 应用程序中实现重量级对象的简单缓存。但我不知道如何正确地做到这一点。

我是否遗漏了什么或 ConcurrentHashMap 方法(putIfAbsent,...)不够用并且需要额外的同步?

是否有更好的简单 API(在内存存储中,无需外部配置)来执行此操作?

P.

最佳答案

根据 Ken 的回答,如果创建一个后来被丢弃的重量级对象是 Not Acceptable (出于某种原因,您想保证为每个键只创建一个对象),那么您可以通过... . 实际上,不要。不要自己做。使用 google-collections (现在 guava ) MapMaker class :

Map<KeyType, HeavyData> cache = new MapMaker<KeyType, HeavyData>()
  .makeComputingMap(new Function<KeyType, HeavyData>() {
      public HeavyData apply(KeyType key) {
          return new HeavyData(key); // Guaranteed to be called ONCE for each key
      }
  });

然后一个简单的 cache.get(key) 就可以工作 并且让您完全不必担心并发和同步的棘手方面。

注意,如果你想添加一些更高级的功能,比如过期,这只是

Map<....> cache = new MapMaker<....>()
  .expiration(30, TimeUnit.MINUTES)
  .makeComputingMap(.....)

如果需要,您还可以轻松地为键或数据使用软值或弱值(有关详细信息,请参阅 Javadoc)

关于java - 使用 java ConcurrentHashMap 实现缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2070407/

相关文章:

java - 调试eclipse单元测试代码 "Test class should have exactly one"和 "Workspace is closed"错误

java - 使用 JPasswordField 更改密码

java - RxJava - 调度程序与 ExecutorService?

java - 并发观察者模式

具有 ConcurrentHashmap 策略的 Java 多线程消费者

java - 如何实现多个线程安全的读/写锁(ConcurrentHashmap)

java - 从 MS Access 中提取数据并输出图表

java - 是否可以确定从 Activity 发回的数据是 String 还是 String[]?

python - 在 Python 中并行化列表理解

java - concurrentHashMap putIfAbsent 方法功能