У меня есть один поток, который обновляет данные в 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
будет достаточно. Единственное, что я хотел бы изменить, это использоватьConcurrentHashMap.compute()
для обновления вместо комбинацииgetValue()
+put()
- даже если это не будет иметь большого значения в случае обновления одного потока. - person Amongalen   schedule 15.06.2020