提问者:小点点

ConcurrentHashMap和ReentrantReadWriteLock


我有一个线程更新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吗?


共1个答案

匿名用户

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

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

>

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

    如果update需要是原子的,那么锁是必需的。 但是如果您使用锁控制访问,则不需要使用ConcurrentHashMap。 简单的hashmap会更好。

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