我有一个在Map中更新数据的线程和几个读取该数据的线程。现在我的代码看起来像这样:
public class Updater {
private ConcurrentMap<String, Integer> valuesMap = new ConcurrentHashMap<>();
private ReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
public void update(Settings settings) {
reentrantReadWriteLock.writeLock().lock();
try {
for (Map.Entry<String, Integer> entry : valuesMap.entrySet()) {
valuesMap.put(entry.getKey(),
entry.getValue() + settings.getUpdateValue());
}
} finally {
reentrantReadWriteLock.writeLock().unlock();
}
}
public Integer getValue(String key) {
reentrantReadWriteLock.readLock().lock();
try {
return valuesMap.get(key);
} finally {
reentrantReadWriteLock.readLock().unlock();
}
}
}但我想我做得太过分了。在这种情况下,我只能使用ConcurrentHashMap吗?
发布于 2020-06-15 22:48:09
在这种情况下,我只能使用ConcurrentHashMap吗?
这取决于您是否希望update操作是原子的;也就是说,当只执行了一些put操作时,您是否希望阅读器永远看不到映射的状态。
update不需要是原子的,那么锁定就是不必要的。update需要是原子的,那么锁就是必需的。但是如果使用锁来控制访问,那么就不需要使用ConcurrentHashMap。一个简单的HashMap会更好。我不认为ConcurrentHashMap有办法将多个put操作实现为一个原子操作。
https://stackoverflow.com/questions/62390438
复制相似问题