我想在web java应用程序中实现一个简单的重量级对象缓存。但我想不出该怎么做。
我是否遗漏了什么或ConcurrentHashMap方法(putIfAbsent,...)还不够,还需要额外的同步吗?
有没有更好的简单API (在内存存储中,不需要外部配置)来做到这一点?
P.
发布于 2010-01-15 17:28:19
如果你想缓存的东西暂时有多个实例是安全的,你可以像这样做一个“无锁”的缓存:
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;
}
多个线程可以“竞争”为键创建和添加项,但只有一个线程应该“获胜”。
发布于 2010-01-15 17:21:59
您可以使用轻型工厂对象来创建活动缓存,而不是将“重对象”放入缓存中。
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;
发布于 2010-01-15 17:09:20
ConcurrentHashMap应该足以满足您的需求putIfAbsent是线程安全的。
我不确定你还能变得多简单
ConcurrentMap myCache = new ConcurrentHashMap();
保罗
https://stackoverflow.com/questions/2070407
复制相似问题