Mat*_*eak 6 java concurrency java.util.concurrent
我有一个Map由多个线程读取的,但是(不时地)由另一个线程清除并重建的线程。
我已经用这张地图包围了所有访问该地图的地方
readWriteLock.readLock().lock()
try {
... access myMap here...
} finally {
readWriteLock.readLock().unlock()
}
Run Code Online (Sandbox Code Playgroud)
...或writeLock()等效项,具体取决于访问类型。
我的问题是...是否ReadWriteLock确保对myMap其他线程可见更新(因为它们必须等到unlock()写入线程调用后才可以?)或者,我是否还需要创建myMap并发映射,例如ConcurrentHashMap?
为了安全起见,我可能会这样做,但我想更好地理解。
是的,即使没有线程感知映射,这也应该没问题。Javadoc明确ReadWriteLock指出:
所有 ReadWriteLock 实现都必须保证 writeLock 操作的内存同步效果(如 Lock 接口中所指定)也相对于关联的 readLock 有效。也就是说,成功获取读锁的线程将看到先前释放写锁时所做的所有更新。
(当然,通过使用读取器/写入器锁,您完全依赖于支持来自不同线程的并发查找的映射。人们可以想象一种巧妙的数据结构,它试图通过在查找期间改变某些内部缓存状态来总体上节省时间。但是标准诸如此类的集合HashMap不会这样做)。
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |