ReadWriteLock 需要 ConcurrentHashMap 吗?

ConcurrentHashMap needed with ReadWriteLock?

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

我已经用

包围了这张地图的所有入口
readWriteLock.readLock().lock()
try {
  ... access myMap here...
} finally {
  readWriteLock.readLock().unlock()
}

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

我的问题是... ReadWriteLock 是否会确保对 myMap 的更新对其他线程可见(因为它们必须等到 unlock() 被写线程?或者,我是否还需要制作 myMap 一个并发映射,例如 ConcurrentHashMap

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

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

All ReadWriteLock implementations must guarantee that the memory synchronization effects of writeLock operations (as specified in the Lock interface) also hold with respect to the associated readLock. That is, a thread successfully acquiring the read lock will see all updates made upon previous release of the write lock.

(当然,通过使用 reader/writer 锁,您依赖于支持来自不同线程的并发 查找 的映射。可以想象聪明的数据结构尝试通过在查找过程中改变一些内部缓存状态来整体节省时间。但是 HashMap 等标准集合不会那样做)。