这是细节。
在这种情况下,没有同步的HashMap会工作吗?否则我将不得不使用ConcurrentHashMap
发布于 2017-03-11 09:15:42
如果您计划同时从多个线程读取和写入映射,则需要ConcurrentHashMap。HashMap不会这样做,因为尝试与get并发执行put可能会导致不正确的行为。
如果写入线程在读取线程启动之前完成,则可以使用常规HashMap。
发布于 2017-03-11 11:15:16
简单地说,你需要一个ConcurrentHashMap。
稍长一点的解释是,这有两个原因。首先,一个简单的HashMap会让读者和编写线程同时处理HashMap的相同内部数据。要使HashMap保持其正确性,显然必须以任何客户端的单个操作的方式更新多个内部属性。在编写器忙于修改这些属性时,允许读取器查询HashMap可能会导致意外行为。
第二点是,如果不使用Java的并发支持机制,一个线程所做更改的可见性对于其他线程来说是不可预测的。因此,即使作者在读者查询HashMap之前完成了工作,也不能保证读者看到了作者离开时看到的数据-- ConcurrentHashMap处理了这个问题。
第一点是,在单处理器机器上,编写线程可能完成插入新值的部分工作,然后在读取器线程从部分更新的地图中读取时产生结果。第二点更多的是多核机器上的问题,每个核心都有自己版本的共享内存,如果使用并发机制,共享内存只能与其他内核进行可预测的同步。
发布于 2017-03-11 09:17:17
我是按照你的问题回答的。
您应该使用ConcurrentHashMap,因为它是线程安全的,而HashMap不是线程安全的。
https://stackoverflow.com/questions/42733405
复制相似问题