如果多个线程写入单个映射,则使用哪个映射实现

Which map implementation to use if multiple threads write to a single map

在我的应用程序中,我将使用地图。

我想了解以下内容:

  1. 这样的话,write方法是否需要同步?
  2. ConcurrentHashMap 适合我的需要吗?
  3. 如果不是,在此应用中使用什么是正确的 Map 实现 案例?

如果您确实需要 Map,那么 ConcurrentHashMap 就是您所需要的。阅读更多相关信息 here

关注这几点:

  • The data that is fed to the map has a different key during every write

  • The data in the map would not be read at any point in the application

您根本不需要 Map。我假设当你声明地图中的数据不会被读取时,你的意思是你没有做 map.get(someKey) 而是你将遍历整个地图以将数据存储在文件中(或无论您使用何种数据源)。

这点:

  • Once in a while the content would be dumped to a file

加强上述建议。

关注点:

  • Multiple threads would be writing data to this map.The write operations are too many.

最好的建议是使用 BlockingQueue. As implementation, you may use LinkedBlockingQueue

如果您使用 Java 同步从 Map 转储数据,并且 want/need 以 Map 的形式恢复此数据,则使用 ConcurrentHashMap。如果这不是您的用例的一部分,因为您将通过其他方式从文件中读取数据,请避免使用 Map 并使用 BlockingQueue.

正如你所说,ConcurrentHashMap 似乎符合你的要求。它是线程安全的,无需同步整个地图。读取可以非常快地进行,而写入是用锁完成的。

您的所有密钥都是唯一的,因此您不一定需要同步来确保地图的完整性,但在实际写入文件时确实需要同步。使用 ConccurentHashMap 或普通的同步映射都适合您。您可以不用 Map 也可以简单地将 key/value 存储在某个对象中并将该对象存储在同步列表中。

  1. 没有

然而我发现这是矛盾的:

  • 地图中的数据在应用程序的任何时候都不会被读取
  • 偶尔会将内容转储到文件中。

如何在不读取文件的情况下转储到文件?

我认为可以肯定地说 ConcurrentHashMap 无论如何都可以处理这种情况,所以去吧。

至1: Map interface does not guarantee any synchronization, especially not on writes. Looking at the non-concurrent implementations (HashMap, HashTable, IdentityHashMap, LinkedHashMap, TreeMap and WeakHashMap), 都表示

if multiple threads access a map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally.

致 2 和 3:如果您使用的是 ConcurrentHashMap, you would not have to worry about synchronization. But I agree with : do not use a Map