一尘不染

使用Java ConcurrentHashMap实现缓存

java

我想在Web Java应用程序中实现重量级对象的简单缓存。但是我不知道该怎么做。

我是否缺少某些东西或ConcurrentHashMap方法(putIfAbsent等)还不够,是否需要额外的同步?

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

P.


阅读 350

收藏
2020-12-03

共1个答案

一尘不染

如果为要缓存的内容临时拥有多个实例是安全的,则可以执行“无锁”缓存,如下所示:

public Heavy instance(Object key) {
  Heavy info = infoMap.get(key);
  if ( info == null ) {
    // It's OK to construct a Heavy that ends up not being used
    info = new Heavy(key);
    Heavy putByOtherThreadJustNow = infoMap.putIfAbsent(key, info);
    if ( putByOtherThreadJustNow != null ) {
      // Some other thread "won"
      info = putByOtherThreadJustNow;
    }
    else {
      // This thread was the winner
    }
  }
  return info;
}

多个线程可以“竞争”来创建和添加密钥项,但是只有一个应该“获胜”。

2020-12-03