提问者:小点点

如果我的线程不改变map的结构,我应该使用并发HashMap还是HashMap?


在这种情况下,我是否需要在Java中使用并发HashMap:

在将HashMap传递给一堆线程之前,我使用所有必要的键启动map:

Key = "thread1Key", Value = null
Key = "thread2Key", Value = null
Key = "thread3Key", Value = null
...

每个任务都是Runnable(由线程执行)的一部分,并且被分配为仅更改其中1个键的值。它是预先分配的。换句话说,我不需要担心多个Runnable可能会更改hashmap中相同键的情况。

在这种情况下,是需要并发HashMap还是需要常规HashMap?为什么?

谢谢!


共3个答案

匿名用户

HashMap的这种用法是安全的,无需额外的同步。该文档准确描述了您的用例:

如果多个线程并发访问哈希映射,并且其中至少有一个线程在结构上修改了映射,则必须在外部同步。(结构修改是任何添加或删除一个或多个映射的操作;仅仅更改与实例已经包含的键关联的值不是结构修改。)

匿名用户

在这种情况下,HashMap可能在结构上保持一致,但也存在其值可见性的问题。如果一个值在一个线程中更改,那么它不能保证被其他线程看到。或者如果是,那么它也可能不一致,因为它在线程之间没有安全发布。

匿名用户

如果地图中没有删除条目,则常规地图就足够了。