锁定 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
.
这给你一对锁:
- 读锁,多个线程可以同时获取
- 一个写锁,只有一个线程可以持有,持有时没有线程可以持有读锁。
尽管名称如此,但没有理由必须将这些锁专门用于读写:
- 获取(并释放)正在更新映射的线程的读锁
- 为必须立即查看整个地图的线程获取(并释放)写锁。
我有几个线程将信息保存到我的 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
.
这给你一对锁:
- 读锁,多个线程可以同时获取
- 一个写锁,只有一个线程可以持有,持有时没有线程可以持有读锁。
尽管名称如此,但没有理由必须将这些锁专门用于读写:
- 获取(并释放)正在更新映射的线程的读锁
- 为必须立即查看整个地图的线程获取(并释放)写锁。