Java是否有“LinkedConcurrentHashMap”数据结构?
2022-08-31 14:23:17
我需要一个数据结构,它是LinkedHashMap并且是线程安全的。
我该怎么做?
我需要一个数据结构,它是LinkedHashMap并且是线程安全的。
我该怎么做?
您可以将地图包装在 Collections.synchronizedMap 中,以获取用于维护广告订单的同步哈希地图。这不如 ConcurrentHashMap 有效(并且不实现 ConcurrentMap 的额外接口方法),但它确实为您提供了(在某种程度上)线程安全行为。
即使是强大的Google Collections似乎也没有解决这个特定的问题。但是,有一个项目确实试图解决这个问题。
我说有点同步,因为迭代仍然不是线程安全的,因为可能会发生并发修改异常。
有许多不同的方法可以解决这个问题。您可以使用:
Collections.synchronizedMap(new LinkedHashMap());
正如其他回应所建议的那样,但这有几个陷阱,你需要注意。最值得注意的是,在迭代集合时,您经常需要保持集合同步锁,这反过来又会阻止其他线程访问该集合,直到您完成对它的迭代。(参见 Java 理论与实践:并发集合类)。例如:
synchronized(map) {
for (Object obj: map) {
// Do work here
}
}
用
new ConcurrentHashMap();
可能是一个更好的选择,因为您不需要锁定集合来迭代它。
最后,您可能需要考虑一种功能更强大的编程方法。也就是说,您可以将地图视为本质上是不可变的。您不应添加到现有地图,而是创建一个包含旧地图内容和新添加内容的新地图。这听起来很奇怪,但它实际上是Scala处理并发和集合的方式。