java - 多线程不同步访问Hashmap

标签 java multithreading hashmap

我有一个需要多个线程访问的 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/

相关文章:

java - 排列单词形成回文

C# 多个同时 System.Diagnostics.Process

java - 处理器和线程之间的区别

java - 什么是对象 k?

java - 在 Java 中搜索文件

java - 如何计算Web服务客户端空闲时间

java - Android 中的 SQLite : Foreign Keys and <table constraint> expected

c++ - 如果两个线程同时访问同一个 bool 变量会发生什么?

java - 如何修复接收对象数组的静态泛型方法

c++ - 判断Unicode字符串是否在C++中具有唯一字符的最有效方法是什么?