我有一个线程更新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
吗?
在这种情况下只能使用ConcurrentHashMap
吗?
这取决于您是否希望update
操作是原子操作; 即当只执行了某些put
操作时,是否希望读取器永远看不到映射的状态。
>
如果update
不需要是原子的,那么锁定是不必要的。 事实上,if是一个不必要的并发瓶颈。
如果update
需要是原子的,那么锁是必需的。 但是如果您使用锁控制访问,则不需要使用ConcurrentHashMap
。 简单的hashmap
会更好。
我认为ConcurrentHashMap
没有办法将多个Put
操作实现为一个原子操作。