通过受读写锁定保护的映射进行缓慢交互:读锁定、并发映射或复制



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

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

如果我降级映射,长迭代器必须保持读锁定以避免并发访问异常。我认为这会阻止写作线程太久。

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

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

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

我有一张经常读取但很少写入的地图。

在这种情况下,我会考虑实现写入映射的副本。

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

如您所见,您永远不需要在读取时获取锁定,只需在写入时获取锁定。

如果我降级映射,长迭代器必须保持读锁定以避免并发访问异常。我认为这会阻止写作线程太久。

与其猜测,我建议你测量它。

我想知道是否有这方面的研究

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

相关内容

  • 没有找到相关文章

最新更新