java - 无锁地对映射结构进行并发读取访问

标签 java multithreading hashmap linkedhashmap

我有一个 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/

相关文章:

java - 获取选中的单选按钮值

java - 在 JAVA 中使用 Mockito 模拟依赖类

您能解释一下 fflush() 和重定向输出发生了什么吗?

java - 数组中的双哈希表示

java - 发布 EAR 文件在 WebSphere 8.0 上挂起

java - 如果使用 SWT.NO_TRIM,如何从任务栏最小化 SWT UI

c# - 启动、停止线程

java - SwingWorker 运行创建线程的类。 java

java - 使用迭代器循环遍历 HashMap 不会因 if 条件而停止

java - 在Java中调用HashMap中对象的方法