Java是否有“LinkedConcurrentHashMap”数据结构?

2022-08-31 14:23:17

我需要一个数据结构,它是LinkedHashMap并且是线程安全的。

我该怎么做?


答案 1

您可以将地图包装在 Collections.synchronizedMap 中,以获取用于维护广告订单的同步哈希地图。这不如 ConcurrentHashMap 有效(并且不实现 ConcurrentMap 的额外接口方法),但它确实为您提供了(在某种程度上)线程安全行为。

即使是强大的Google Collections似乎也没有解决这个特定的问题。但是,有一个项目确实试图解决这个问题。

我说有点同步,因为迭代仍然不是线程安全的,因为可能会发生并发修改异常。


答案 2

有许多不同的方法可以解决这个问题。您可以使用:

Collections.synchronizedMap(new LinkedHashMap());

正如其他回应所建议的那样,但这有几个陷阱,你需要注意。最值得注意的是,在迭代集合时,您经常需要保持集合同步锁,这反过来又会阻止其他线程访问该集合,直到您完成对它的迭代。(参见 Java 理论与实践:并发集合类)。例如:

synchronized(map) {
    for (Object obj: map) {
        // Do work here
    }
}

new ConcurrentHashMap();

可能是一个更好的选择,因为您不需要锁定集合来迭代它。

最后,您可能需要考虑一种功能更强大编程方法。也就是说,您可以将地图视为本质上是不可变的。您不应添加到现有地图,而是创建一个包含旧地图内容和新添加内容的新地图。这听起来很奇怪,但它实际上是Scala处理并发和集合的方式。


推荐