Java 读写锁保护映射上的缓慢交互:读锁、并发映射还是复制?

Java 读写锁保护映射上的缓慢交互:读锁、并发映射还是复制?,java,concurrency,concurrent-collections,Java,Concurrency,Concurrent Collections,我有一张经常阅读但很少写信的地图。有些操作(可以是读操作或写操作)涉及多个需要原子操作的对象,因此我使用ReadWriteLock来提高性能 现在我可以选择将并发映射降级为普通的哈希映射,但我担心一些缓慢的迭代代码 如果我降级映射,那么长迭代器必须持有读锁以避免并发访问异常。我认为这会使书写线程阻塞太长时间 由于某些迭代器对不一致的数据不敏感,因此我可以保留并发映射,以便迭代器可以用于并发写入。但是,这会给正确使用锁的操作增加不必要的开销(来自并发映射) 或者,我可以实现类似于读写映射的东西,其

我有一张经常阅读但很少写信的地图。有些操作(可以是读操作或写操作)涉及多个需要原子操作的对象,因此我使用ReadWriteLock来提高性能

现在我可以选择将并发映射降级为普通的哈希映射,但我担心一些缓慢的迭代代码

如果我降级映射,那么长迭代器必须持有读锁以避免并发访问异常。我认为这会使书写线程阻塞太长时间

由于某些迭代器对不一致的数据不敏感,因此我可以保留并发映射,以便迭代器可以用于并发写入。但是,这会给正确使用锁的操作增加不必要的开销(来自并发映射)

或者,我可以实现类似于读写映射的东西,其中整个(非并发)映射被克隆用于写操作,以便现有迭代器继续在读锁之外工作

显然,所有这些方法都是有效的,性能取决于实际的代码和设置。然而,我想知道有没有关于这方面的研究(所以我不必自己做实验)

我有一张经常阅读但很少写信的地图

在这种情况下,我会考虑写一份书面地图。e、 g

private final Map<Key, Value> map = ?* thread safe map */
private volatile Map<Key, Value> mapCopy = emptyMap();

// when you write
get lock
modify map
take a copy and store it in mapCopy
release lock

// when you read
Map<Key, Value> map = this.mapCopy;
use map
私有最终映射=?*线程安全映射*/
私有易失性映射mapCopy=emptyMap();
//当你写作时
上锁
修改地图
复制并存储在mapCopy中
释放锁
//当你读书的时候
Map Map=this.mapCopy;
使用地图
正如您所看到的,您不需要在读取时获得锁,只需要在写入时获得锁

如果我降级映射,那么长迭代器必须持有读锁以避免并发访问异常。我认为这会使书写线程阻塞太长时间

我建议你测量一下,而不是猜测

我想知道有没有这方面的研究


如果是这样的话,我不会太认真地对待这样的研究。正如您所建议的,结果会根据您的情况而有所不同。

这里有一个链接可以告诉您hashmap和并发hashmap之间的性能差异。我希望有人做过一些研究,比如当地图大小这么大,访问模式是这样的时候,那么实现的性能是这样的,但也许我要求太多了。我同意你的观点,即“写上拷贝”映射似乎更有效。CopyOnWriteArrayXxxx集合使用这种方法。在考虑地图大小时,您需要考虑键和值的复杂性,例如它们是否需要深度复制?如果您认为这会有用,您可以将此类报告作为文章发布。;)