Java 集合之 HashMap 使用注意事项


这篇博文来总结下关于HashMap 使用的相关注意事项。

什么时候用HashMap?什么时候用CurrentHashMap?

除了局部方法或绝对线程安全的情形外,优先推荐使用HashMap.

为什么呢?

以下是高并发场景下慎用HahsMap 的两个主要原因:

  • HashMap 的死链问题
  • 扩容数据丢失问题

问题示例

某个应用在init()方法中初始化一个staitc 的HashMap 集合对象,从数据库提取数据到集合中。

应用启动过程中在单线程调用一次初始化方法,不应该有任何问题。

但是机缘巧合下,init()方法被执行了两次,启动失败,CPU 使用率飙升,dump 分析发出存现HashMap 死链。

解决方案

解决方案有三种:

  1. 使用ConcurrentHashMap 替代HashMap
  2. 使用Collections.synchronizedMap(hashMap);
  3. 对init()方法进行同步操作。

HashMap 在高并发场景中新增对象丢失原因

HashMap 在高并发场景中新增对象丢失原因如下

  • 并发赋值时被覆盖
  • 已遍历区间新增元素会丢失
  • 新表被覆盖
  • 迁移丢失。 在迁移过程中,有并发时,next 被提前置成null.
发布了162 篇原创文章 · 获赞 219 · 访问量 40万+

猜你喜欢

转载自blog.csdn.net/hadues/article/details/103160889