下面的类充当一个简单的缓存,它很少更新(例如,一天两次)并且被读取很多(最多每秒几次)。有两种不同的类型,aList
和 a Map
。我的问题是关于方法中数据更新后的新分配update
。应用新数据的最佳(最安全)方式是什么?
我应该补充一点,读者没有必要看到绝对的最新值。要求只是在任何给定时间获得旧值或新值。
public class Foo {
private ThreadPoolExecutor _executor;
private List<Object> _listObjects = new ArrayList<Object>(0);
private Map<Integer, Object> _mapObjects = new HashMap<Integer, Object>();
private Object _mutex = new Object();
private boolean _updateInProgress;
public void update() {
synchronized (_mutex) {
if (_updateInProgress) {
return;
} else {
_updateInProgress = true;
}
}
_executor.execute(new Runnable() {
@Override
public void run() {
try {
List<Object> newObjects = loadListObjectsFromDatabase();
Map<Integer, Object> newMapObjects = loadMapObjectsFromDatabase();
/*
* this is the interesting part
*/
_listObjects = newObjects;
_mapObjects = newMapObjects;
} catch (final Exception ex) {
// error handling
} finally {
synchronized (_mutex) {
_updateInProgress = false;
}
}
}
});
}
public Object getObjectById(Integer id) {
return _mapObjects.get(id);
}
public List<Object> getListObjects() {
return new ArrayList<Object>(_listObjects);
}
}
如您所见,目前没有使用ConcurrentHashMap
或CopyOnWriteArrayList
使用。唯一的同步是在更新方法中完成的。
尽管对于我当前的问题不是必需的,但对于读者必须始终获得绝对最新价值的情况,了解最佳解决方案也很棒。