gpt4 book ai didi

java - 锁定写入 HashMap

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:26:07 27 4
gpt4 key购买 nike

我有一个异步更新的 HashMap。我需要执行涉及 map 的操作,要求 map 在任务期间不会更改状态,例如根据 map 的内容对值进行排序。

有没有一种方法可以锁定映射,以便只发生读取,这会阻塞所有写入线程,因此在映射解锁后,所有修改都可以发生?锁需要能够允许多个线程同时写入,因为我正在使用 ConcurrentHashMap,我想利用 ConcurrentHashMap 的好处。

最佳答案

为什么不使用受 ReentrantReadWriteLock 保护的 ConcurrentHashMap 而是反向使用呢?

myLock.writeLock().lock();
try {
return myMap.get(...);
} finally {
myLock.writeLock().unlock();
}

myLock.readLock().lock();
try {
myMap.put(..., ...);
} finally {
myLock.readLock().unlock();
}

这非常难看,需要在注释中覆盖它,以警告未启动的后续开发人员您实际上是在按住 readLock 时写入,而在按住 writeLock 时读取> 但我不明白为什么它不起作用。

为了清晰起见,您甚至可以编写自己的 InversedReentrantReadWriteLock 来包装真正的 ReentrantReadWriteLock 以反转调用并使代码更具可读性。

如果按照@GPI 的建议,您想要处于读取模式或写入模式但在该模式下保持并发,则可以使用 AtomicIntegerAtomicLong实现锁定。正值表示处于读取模式,负值表示处于写入模式。为零表示锁可以进入任一模式。这立即变得更加复杂,因为您必须自己实现锁定,而上面概述的并发写入和独占读取解决方案仅依赖于现有的 API 类。 (如果您愿意,我相信我可以解决,但我无法立即提供答案)

关于java - 锁定写入 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25079093/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com