实现并发链接哈希映射

2022-09-04 04:19:39

我正在尝试为多线程架构创建一个并发的LinkedHashMap。

如果我使用 ,我必须使用同步块进行迭代。这种实现将导致依次添加元素。Collections#synchronizedMap()

如果我使用有没有办法实现一个按顺序存储,如存储在链表或队列中。ConcurrentSkipListMapComparator

我想使用Java的内置而不是第三方软件包。

编辑:

在这个同时期,如果密钥是名称,我希望按它们到达的顺序放置密钥。即,新值将在开头或结尾追加,但按顺序。LinkedHashMap

在迭代时,可以使用新条目添加或删除 。但迭代应该是添加条目的顺序。LinkedHashMap

我知道通过使用,必须实现用于迭代的同步块,但是在迭代时映射是可修改的(可以添加/删除条目)。Collections#synchronizedMap()


答案 1

如果使用 syncedMap,则不必在外部进行同步,但迭代除外。如果需要保留地图的顺序,则应使用排序地图。您可以使用 ConcurrentSkipListMap,它是线程安全的,或者另一个 SortedMap 与 syncedSortedMap 结合使用。


答案 2

A 有一个通过哈希表运行的双链表。FIFO仅在写入(插入或删除)时改变链接。这使得实现一个版本相当简单。LinkedHashMap

  1. 编写仅允许广告订单的 LHM。
  2. 切换到 ConcurrentHashMap 作为哈希表。
  3. 保护 / / 带锁。#put()#putIfAbsent()#remove()
  4. 使“下一个”字段不稳定。

在迭代时,不需要锁定,因为您可以安全地跟踪“next”字段。读取可以无锁,只需将 权限委托给 上的 CHM 即可。#get()