HashMap在并发下可能出现的问题分析
我们都知道,HashMap在并发环境下使用可能出现问题,但是具体表现,以及为什么出现并发问题, 可能并不是所有人都了解,这篇文章记录一下HashMap在多线程环境下可能出现的问题以及如何避免。 在分析HashMap的并发问题前,先简单了解HashMap的put和get基本操作是如何实现的。 >>HashMap的put和get操作 大家知道HashMap内部实现是通过拉链法解决哈希冲突的,也就是通过链表的结构保存散列到同一数组位置的两个值, put操作主要是判空, 对key的hashcode执行一次HashMap自己的哈希函数,得到bucketindex位置,还有对重复key的覆盖操作 。 对照源码分析一下具体的put操作是如何完成的: public V put(K key, V value) { if (key == null) return putForNullKey(value); //得到key的hashcode,同时再做一次hash操作 int hash = hash(key.hashCode()); //对数组长度取余,决定下标位置 int i = indexFor(hash, table.length); /** * 首先找到数组下标处的链表结点, * 判断key对一个的hash值是否已经存在,如果存在将其替换为新的value */ for (Entry e =