从多个线程访问Hashmap而不进行同步

时间:2014-03-03 21:27:20

标签: java multithreading hashmap

我有一个HashMap,我需要多个线程才能访问。我的设计是这样的,每个线程将在地图中读取和写入自己的条目:相同的地图,但没有两个线程在同一条目上工作。没有任何一个线程需要迭代地图或调用size()。所以我的问题是:我是否必须在Hashmap上进行同步,或者我可以放心地使用它,它永远不会抛出ConcurrentModificationException?我显而易见的担心是同步会造成巨大的瓶颈。

1 个答案:

答案 0 :(得分:3)

  

所以我的问题是:我是否必须在Hashmap上进行同步,或者我可以放心地使用它,它永远不会抛出ConcurrentModificationException?

您应该使用ConcurrentHashMap来实现此目的。问题不仅仅是关于迭代的 ,而是关于内存同步。

  

...每个帖子都会在地图上读写自己的条目......

这是一个含糊不清的人。如果您的HashMap是静态的,因为线程只是从地图读取并且仅对地图中引用的对象进行更改,但更改在地图中的价值,那么你会没事的。您可以在线程启动之前初始化地图,并且可以在没有内存同步的情况下使用地图。

但是,如果一个线程以任何方式更改地图以指向新对象,则必须将该更改发布到中央内存,其他线程必须查看这些更新。这需要在读写端进行内存同步。

  

我明显担心的是,同步会造成巨大的瓶颈。

这有点过早的优化。在对地图进行争用之前,很可能您会被IO限制。在任何情况下,切换为使用ConcurrentHashMap都可以减轻您的后顾之忧,与非同步地图相比,性能会有所降低。