在我的应用程序中,我将使用Map。
我想知道以下内容:
答案 0 :(得分:7)
关注以下几点:
- 期间,输入到地图的数据都有不同的键
在每次写入
- 中的任何位置读取地图中的数据
不会在应用程序
您根本不需要Map
。我假设当你声明地图中的数据不会被读取时,你的意思是你没有做map.get(someKey)
,而是你将遍历整个地图以将数据存储在文件中(或者无论你使用什么数据源。)
这一点:
- 偶尔会将内容转储到文件
强化上述建议。
关注这一点:
- 多个线程会将数据写入此映射。写入操作太多。
最好的建议是使用BlockingQueue
。作为实现,您可以使用LinkedBlockingQueue
。
如果您使用Java同步从Map
转储数据并希望/需要以Map
的形式恢复此数据,请使用ConcurrentHashMap
。如果这不是您的用例的一部分,因为您将通过其他方式从文件中读取数据,请避免使用Map
并使用BlockingQueue
。
答案 1 :(得分:1)
要1:Map
接口不保证任何同步,尤其是写入时不保证。查看非并发实现(HashMap
,HashTable
,IdentityHashMap
,LinkedHashMap
,TreeMap
和WeakHashMap
),所有状态< / p>
如果多个线程同时访问一个映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。
至2和3:如果您使用的是ConcurrentHashMap
,则无需担心同步问题。但我同意Luiggi Mendoza's answer:不要使用Map
。
答案 2 :(得分:0)
然而我发现这是一个矛盾:
如何在不阅读文件的情况下转储到文件中?
我认为可以说ConcurrentHashMap无论如何都可以处理这种情况,所以去吧。
答案 3 :(得分:-1)
如果您确实需要Map
,则ConcurrentHashMap
就是您所需要的。阅读更多相关信息here。
答案 4 :(得分:-1)
正如你所说,ConcurrentHashMap似乎符合你的要求。没有同步整个地图是线程安全的。使用锁定进行写入时,读取可以非常快速地发生。
答案 5 :(得分:-3)
您的所有密钥都是唯一的,因此您不一定需要同步来确保地图的完整性,但在实际写入文件时确实需要它。使用ConccurentHashMap或普通的同步地图都很适合你。您可以在没有Map的情况下将键/值存储在某个对象中,并将该对象存储在同步列表中。