我有一个HashMap,我需要多个线程才能访问。我的设计是这样的,每个线程将在地图中读取和写入自己的条目:相同的地图,但没有两个线程在同一条目上工作。没有任何一个线程需要迭代地图或调用size()
。所以我的问题是:我是否必须在Hashmap上进行同步,或者我可以放心地使用它,它永远不会抛出ConcurrentModificationException?我显而易见的担心是同步会造成巨大的瓶颈。
答案 0 :(得分:3)
所以我的问题是:我是否必须在Hashmap上进行同步,或者我可以放心地使用它,它永远不会抛出ConcurrentModificationException?
您应该使用ConcurrentHashMap
来实现此目的。问题不仅仅是关于迭代的 ,而是关于内存同步。
...每个帖子都会在地图上读写自己的条目......
这是一个含糊不清的人。如果您的HashMap
是静态的,因为线程只是从地图读取并且仅对地图中引用的对象进行更改,但不更改在地图中的价值,那么你会没事的。您可以在线程启动之前初始化地图,并且可以在没有内存同步的情况下使用地图。
但是,如果一个线程以任何方式更改地图以指向新对象,则必须将该更改发布到中央内存,其他线程必须查看这些更新。这需要在读写端进行内存同步。
我明显担心的是,同步会造成巨大的瓶颈。
这有点过早的优化。在对地图进行争用之前,很可能您会被IO限制。在任何情况下,切换为使用ConcurrentHashMap
都可以减轻您的后顾之忧,与非同步地图相比,性能会有所降低。