繁体   English   中英

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

[英]Accessing Hashmap from multiple threads without synchronization

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

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

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

...每个线程都将在地图中读取和写入自己的条目...

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

但是,如果一个线程以任何方式更改映射以指向新对象,则它必须将该更改发布到中央内存,其他线程必须查看这些更新。 这需要在读取和写入两侧进行存储器同步。

我显而易见的担心是同步会造成巨大的瓶颈。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM