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

时间:2015-07-21 14:46:28

标签: java multithreading dictionary synchronization concurrenthashmap

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

  • 多个线程会将数据写入此映射。写操作太多了。
  • 但是,每次写入时,送到地图的数据都有不同的密钥。
  • 不会在应用程序的任何位置读取地图中的数据。
  • 偶尔会将内容转储到文件中。

我想知道以下内容:

  1. 在这种情况下,是否需要同步write方法?
  2. ConcurrentHashMap是否符合我的需求?
  3. 如果没有,那么在这里使用什么是正确的Map实现 情况?

6 个答案:

答案 0 :(得分:7)

关注以下几点:

  
      
  • 在每次写入

  • 期间,输入到地图的数据都有不同的键   
  • 不会在应用程序

  • 中的任何位置读取地图中的数据   

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

这一点:

  
      
  • 偶尔会将内容转储到文件
  •   

强化上述建议。

关注这一点:

  
      
  • 多个线程会将数据写入此映射。写入操作太多。
  •   

最好的建议是使用BlockingQueue。作为实现,您可以使用LinkedBlockingQueue

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

答案 1 :(得分:1)

要1:Map接口不保证任何同步,尤其是写入时不保证。查看非并发实现(HashMapHashTableIdentityHashMapLinkedHashMapTreeMapWeakHashMap),所有状态< / p>

  

如果多个线程同时访问一个映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。

至2和3:如果您使用的是ConcurrentHashMap,则无需担心同步问题。但我同意Luiggi Mendoza's answer:不要使用Map

答案 2 :(得分:0)

  1. 没有
  2. 然而我发现这是一个矛盾:

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

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

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

答案 3 :(得分:-1)

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

答案 4 :(得分:-1)

正如你所说,ConcurrentHashMap似乎符合你的要求。没有同步整个地图是线程安全的。使用锁定进行写入时,读取可以非常快速地发生。

答案 5 :(得分:-3)

您的所有密钥都是唯一的,因此您不一定需要同步来确保地图的完整性,但在实际写入文件时确实需要它。使用ConccurentHashMap或普通的同步地图都很适合你。您可以在没有Map的情况下将键/值存储在某个对象中,并将该对象存储在同步列表中。