首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用java ConcurrentHashMap实现缓存

使用java ConcurrentHashMap实现缓存
EN

Stack Overflow用户
提问于 2010-01-15 16:59:41
回答 4查看 17.9K关注 0票数 17

我想在web java应用程序中实现一个简单的重量级对象缓存。但我想不出该怎么做。

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

有没有更好的简单API (在内存存储中,不需要外部配置)来做到这一点?

P.

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-15 17:28:19

如果你想缓存的东西暂时有多个实例是安全的,你可以像这样做一个“无锁”的缓存:

代码语言:javascript
复制
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;
}

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

票数 14
EN

Stack Overflow用户

发布于 2010-01-15 17:21:59

您可以使用轻型工厂对象来创建活动缓存,而不是将“重对象”放入缓存中。

代码语言:javascript
复制
public abstract class LazyFactory implements Serializable {

  private Object _heavyObject;

  public getObject() {
    if (_heavyObject != null) return _heavyObject;
    synchronized {
      if (_heavyObject == null) _heavyObject = create();
    }
    return _heavyObject;
  }

  protected synchronized abstract Object create();
}

// here's some sample code

// create the factory, ignore negligible overhead for object creation
LazyFactory factory = new LazyFactory() {
  protected Object create() {
    // do heavy init here
    return new DbConnection();
  };
};
LazyFactory prev = map.pufIfAbsent("db", factory);
// use previous factory if available
return prev != null ? prev.getObject() : factory.getObject;
票数 2
EN

Stack Overflow用户

发布于 2010-01-15 17:09:20

ConcurrentHashMap应该足以满足您的需求putIfAbsent是线程安全的。

我不确定你还能变得多简单

代码语言:javascript
复制
ConcurrentMap myCache = new ConcurrentHashMap();

保罗

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2070407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档