无锁定的地图结构上的并发读取访问权限

时间:2017-04-30 00:30:06

标签: java multithreading hashmap linkedhashmap

我有一个hashmap:

LinkedHashMap<Long, List<IOperation>> operations.

由多个线程编写。我用它锁定。

synchronized (lock){...}

确保在给定时刻只有1个线程写入。

无论如何,在某些情况下我需要对它进行一些长读取请求。

为此,我复制地图:

temp.putAll(operations);

= new LinkedHashMap<>(operations)

是否可以使用以下前提制作此类副本:

  • 无需锁定地图即可将其复制。
  • 没有按地图成员及其副本的值调用。

非常感谢

其他一些细节。

我经常执行一系列长读取,性能至关重要。

1 个答案:

答案 0 :(得分:0)

在初始化LinkedHashMap<Long, List<IOperation>>以将其包装在Collections#synchronizedMap中时,您很可能会更容易,因此地图上的每个原子操作都将被同步,而不必自己完成。

如果您坚持复制Map而不必将其锁定,我会在开始阅读时创建另一个LinkedHashMap同步Map

Map<Long, List<IOperation>> copy = new LinkedHashMap<>(synchronizedMap);

您还可以使用Map作为锁定,将“长读取请求”简单地包装在同步块中,从而无需复制Map