繁体   English   中英

锁定 ConcurrentHashMap 以进行独占读取

[英]Locking ConcurrentHashMap for an exclusive read

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

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

尝试这样的事情。 使用监视器保护 map 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

这给了你一对锁:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM