gpt4 book ai didi

java - 在并发环境中更新高度读取的列表/ map

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:13:04 26 4
gpt4 key购买 nike

下面的类充当一个简单的缓存,它很少更新(例如一天两次)并且被读取很多(每秒最多几次)。有两种不同的类型,ListMap。我的问题是关于在 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);
}


}

如您所见,目前没有使用 ConcurrentHashMapCopyOnWriteArrayList。唯一的同步是在更新方法中完成的。

虽然对于我当前的问题来说不是必需的,但如果知道对于读者始终获得绝对最新值至关重要的情况的最佳解决方案也很棒。

最佳答案

除非您每秒阅读超过 10,000 次,否则您可以使用计划同步。

如果你想要并发访问,我会使用并发集合,如 ConcurrentHashMap 或 CopyOnWriteArrayList。这些比同步集合更易于使用。 (即出于性能原因您不需要它们,为简单起见使用它们)

顺便说一句:现代 CPU 可以在 0.1 秒内执行数十亿次操作,因此每秒几次对于计算机来说是永恒的。

关于java - 在并发环境中更新高度读取的列表/ map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11099058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com