首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >单作者/单一阅读器场景的HashMap或ConcurrentHashMap?

单作者/单一阅读器场景的HashMap或ConcurrentHashMap?
EN

Stack Overflow用户
提问于 2017-03-11 09:12:41
回答 5查看 1.4K关注 0票数 3

这是细节。

  1. 一个线程写入映射,另一个线程从中读取。
  2. 一旦插入键,就永远不会更新。
  3. 如果使用者线程找不到映射中的值,它可以计算值本身。它将找不到1%的值,因为它们不会由生产者线程计算。
  4. 当消费者要求一个值时,它应该尽快得到它。

在这种情况下,没有同步的HashMap会工作吗?否则我将不得不使用ConcurrentHashMap

EN

回答 5

Stack Overflow用户

发布于 2017-03-11 09:15:42

如果您计划同时从多个线程读取和写入映射,则需要ConcurrentHashMapHashMap不会这样做,因为尝试与get并发执行put可能会导致不正确的行为。

如果写入线程在读取线程启动之前完成,则可以使用常规HashMap

票数 4
EN

Stack Overflow用户

发布于 2017-03-11 11:15:16

简单地说,你需要一个ConcurrentHashMap

稍长一点的解释是,这有两个原因。首先,一个简单的HashMap会让读者和编写线程同时处理HashMap的相同内部数据。要使HashMap保持其正确性,显然必须以任何客户端的单个操作的方式更新多个内部属性。在编写器忙于修改这些属性时,允许读取器查询HashMap可能会导致意外行为。

第二点是,如果不使用Java的并发支持机制,一个线程所做更改的可见性对于其他线程来说是不可预测的。因此,即使作者在读者查询HashMap之前完成了工作,也不能保证读者看到了作者离开时看到的数据-- ConcurrentHashMap处理了这个问题。

第一点是,在单处理器机器上,编写线程可能完成插入新值的部分工作,然后在读取器线程从部分更新的地图中读取时产生结果。第二点更多的是多核机器上的问题,每个核心都有自己版本的共享内存,如果使用并发机制,共享内存只能与其他内核进行可预测的同步。

票数 4
EN

Stack Overflow用户

发布于 2017-03-11 09:17:17

我是按照你的问题回答的。

您应该使用ConcurrentHashMap,因为它是线程安全的,而HashMap不是线程安全的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42733405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档