我有一个 HashMap :
LinkedHashMap<Long, List<IOperation>> operations.
这是由多个线程写入的。我在它周围使用了锁。
synchronized (lock){...}
确保在给定时刻只有 1 个线程对其进行写入。
尽管如此,在某些情况下我需要对其进行一些长读请求。
为此,我复制了 map :
temp.putAll(operations);
或
= new LinkedHashMap<>(operations)
有没有办法在以下前提下制作这样的副本:
- 无需锁定 map 即可复制。
- 不对 map 及其副本的成员进行值调用。
谢谢了
一些额外的细节。
我经常对其执行一系列长读取,性能至关重要。
最佳答案
初始化 LinkedHashMap<Long, List<IOperation>>
时对您来说可能会更容易将其包裹在 Collections#synchronizedMap
中因此 map 上的每个原子操作都会同步,而不必自己执行。
如果您坚持复制Map
无需锁定它,我只需创建另一个 LinkedHashMap
与同步Map
当开始阅读它时。
Map<Long, List<IOperation>> copy = new LinkedHashMap<>(synchronizedMap);
您还可以消除对 Map
副本的需要通过使用 Map
将“长读取请求”简单地包装在同步块(synchronized block)中作为锁。
关于java - 无锁地对映射结构进行并发读取访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43701753/