我有一个需要多个线程访问的 HashMap。我的设计是每个线程都将读取和写入映射中自己的条目:同一个映射,但没有两个线程在同一个条目上工作。没有一个线程需要遍历 map 或调用 size()
。所以我的问题是:我是否必须在 Hashmap 上进行同步,或者我是否可以自信地使用它,它永远不会抛出 ConcurrentModificationException?我显然担心同步会造成巨大的瓶颈。
最佳答案
So my question is: do I have to synchronize on the Hashmap or may I just use it with confidence that it will never throw a ConcurrentModificationException?
您应该为此目的使用ConcurrentHashMap
。这个问题不仅仅是关于迭代的问题,也是关于内存同步的问题。
... each thread will be reading and writing to its own entry in the map ...
这是一个暧昧的人。如果您的 HashMap
是静态的,因为线程只是从 map 中读取并且只对 map 中引用的对象进行更改,但不是 更改 map 中的值,就可以了。您可以在线程启动之前初始化您的 map ,并且它们可以在没有内存同步的情况下使用 map 。
但是,如果一个线程以任何方式更改映射以指向新对象,它必须将更改发布到中央内存,并且其他线程必须看到这些更新。这需要在读取和写入端进行内存同步。
My obvious worry is that synchronizing will create a huge bottleneck.
这有点过早优化的味道。很可能在 map 争用成为问题之前很久您就会受到 IO 的限制。在任何情况下,切换到使用 ConcurrentHashMap
都会减轻您的担忧,并且与非同步映射相比,性能下降最小。
关于java - 多线程不同步访问Hashmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22157813/