锁定 ConcurrentHashMap 以进行独占读取

Locking ConcurrentHashMap for an exclusive read

我有几个线程将信息保存到我的 ConcurrentHashMap<K,V>。我应该在父线程中拍摄整个地图的快照,处理其中的信息并最终从所有值和键中清空它。

如何确保在读取期间(在父线程中),在我完成它之前,它不会被写入它的任何子线程更新?是否可以使用信号量或互斥锁来锁定此数据结构?

尝试这样的事情。使用监视器来保护地图 field 因此当您拍摄快照时,其他人无法将值放入其中。

public class Example<K, V> {
    private final Map<K, V> map = new HashMap<>();
    private final Object monitor = new Object();

    public Object snapshot() {
        synchronized (monitor) {
            // take the snapshot and return it
        }
    }

    public V put(K key, V value) {
        synchronized (monitor) {
            return map.put(key, value);
        }
    }
}

此外,在此示例中,您可以通过使用简单的 HashMap 而不是 ConcurrentHashMap 来简化它,因为您有监视器保护对该字段的访问。

使用 ReadWriteLock.

这给你一对锁:

  • 读锁,多个线程可以同时获取
  • 一个写锁,只有一个线程可以持有,持有时没有线程可以持有读锁。

尽管名称如此,但没有理由必须将这些锁专门用于读写:

  • 获取(并释放)正在更新映射的线程的读锁
  • 为必须立即查看整个地图的线程获取(并释放)写锁。