我有一个hashmap:
LinkedHashMap<Long, List<IOperation>> operations.
由多个线程编写。我用它锁定。
synchronized (lock){...}
确保在给定时刻只有1个线程写入。
无论如何,在某些情况下我需要对它进行一些长读取请求。
为此,我复制地图:
temp.putAll(operations);
或
= new LinkedHashMap<>(operations)
是否可以使用以下前提制作此类副本:
非常感谢
其他一些细节。
我经常执行一系列长读取,性能至关重要。
答案 0 :(得分:0)
在初始化LinkedHashMap<Long, List<IOperation>>
以将其包装在Collections#synchronizedMap
中时,您很可能会更容易,因此地图上的每个原子操作都将被同步,而不必自己完成。
如果您坚持复制Map
而不必将其锁定,我会在开始阅读时创建另一个LinkedHashMap
同步Map
。
Map<Long, List<IOperation>> copy = new LinkedHashMap<>(synchronizedMap);
您还可以使用Map
作为锁定,将“长读取请求”简单地包装在同步块中,从而无需复制Map
。