首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConcurrentHashMap和ReentrantReadWriteLock

ConcurrentHashMap和ReentrantReadWriteLock
EN

Stack Overflow用户
提问于 2020-06-15 22:30:55
回答 1查看 204关注 0票数 1

我有一个在Map中更新数据的线程和几个读取该数据的线程。现在我的代码看起来像这样:

代码语言:javascript
复制
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吗?

EN

回答 1

Stack Overflow用户

发布于 2020-06-15 22:48:09

在这种情况下,我只能使用ConcurrentHashMap吗?

这取决于您是否希望update操作是原子的;也就是说,当只执行了一些put操作时,您是否希望阅读器永远看不到映射的状态。

  • 如果update不需要是原子的,那么锁定就是不必要的。
  • 如果update需要是原子的,那么锁就是必需的。但是如果使用锁来控制访问,那么就不需要使用ConcurrentHashMap。一个简单的HashMap会更好。

我不认为ConcurrentHashMap有办法将多个put操作实现为一个原子操作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62390438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档