我有一个Map,它被多个线程读取,但是(不时地)被另一个线程清除并重建。

我已经用这张 map 包围了所有访问该 map 的地方

readWriteLock.readLock().lock()
try {
  ... access myMap here...
} finally {
  readWriteLock.readLock().unlock()
}

...或writeLock()等效项,具体取决于访问类型。

我的问题是... ReadWriteLock是否可确保其他线程可以看到myMap的更新(因为它们必须等到编写线程调用unlock()之后??或者,我是否还需要使myMap成为并发映射,例如ConcurrentHashMap

为了安全起见,我可能会这样做,但我想更好地理解。

最佳答案

是的,即使没有线程感知映射也应该没问题。 Javadoc for ReadWriteLock 明确表示:



(当然,通过使用读取器/写入器锁,您完全依赖于支持来自不同线程的并发查找的映射。人们可以想象到一种聪明的数据结构,该结构试图通过在查找过程中更改某些内部缓存状态来节省总体时间。但是,这是标准的像HashMap这样的集合将不会执行此操作)。

关于java - 使用ReadWriteLock需要ConcurrentHashMap吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57332649/

10-12 03:52