HashMap与ConcurrentHashMap的区别与应用场景_一般用hashmap还是concurent-CSDN博客
1 HashMap与ConcurrentHashMap多线程同步的误区
使用了ConcurrentHashMap就意味着多线程环境中的数据是线程同步的吗?
答案是不一定。用以下代码来作为示例来说明.
1.1 编码思路
分别创建一个全局HashMap和一个全局ConcurrentHashMap
分别赋予初始值。
多线程修改这两个集合
然后输出值,比较最终结果。
1.2 需要验证的结论
HashMap在多线程情况下操作不能保证数据同步。
ConcurrentHashMap多线程操作同样不能保证数据同步。
1.3 验证代码
Demo1类,验证HashMap多线程操作数据不同步.
2.3 推荐HashMap应用场景
上文中的输出示例验证了多线程操作下HashMap无法保证数据同步,多线程修改HashMap并且有遍历的操作时,可能会产生ConcurrentModificationException异常。所以,推荐的HashMap应用场景是单线程运行环境,并且不需要遍历操作的场景。
这个推荐场景不是硬性条件。比如多线操作HashMap,我们通过加锁或者加入同步控制依然能正常应用HashMap,只是需要加上同步操作的代价。
3 推荐ConcurrentHashMap应用场景
ConcurrentHashMap所有操作都是线程安全的,但获取操作不必锁定,并且不支持以某种防止所有访问的方式锁定整个表。获取操作(包括 get)通常不会受阻塞,因此,可能与更新操作交迭(包括 put 和 remove)。在创建迭代器/枚举时或自此之后,Iterators 和 Enumerations返回在某一时间点上影响哈希表状态的元素。它们不会 抛出 ConcurrentModificationException。
每次运行输出结果可能会不一致。这个是多线程操作下,不能保证插入顺序,所以插入的随机值位置不固定。输出遍历前h后的ConcurrentHashMap长度不一致。
这种情况说明,在遍历ConcurrentHashMap时如果遍历过程中,该集合的机构发生变化,比如put,remove数据。这时不会抛出ConcurrentModificationException,能够正常遍历完成ConcurrentHashMap.
ConcurrentHashMap推荐应用场景 多线程对HashMap数据添加删除操作时,可以采用ConcurrentHashMap。