1

我有一个更新数据的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在这种情况下使用吗?

4

1 回答 1

3

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

这取决于您是否希望update操作是原子的;即,您是否希望读者在仅put执行某些操作时永远看不到地图的状态。

  • 如果update不需要是原子的,那么锁定是不必要的。事实上,如果是一个不需要的并发瓶颈。

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

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

于 2020-06-15T14:48:09.333 回答