使用多线程插入hashMap的数量问题

两个线程分别往一个hashMap里插入,以i为key,为什么最后hashMap的数量超过1W了?i最大不是也就9999吗?

img

你有2个线程,每个插入1W,数量最大1W?
我猜你想问的是,hashMap里怎么会出现重复的数据
正常线性操作的时候,数据进入之前会进行校验,不会出现重复数据
但你是多线程操作,而hashMap是线程不安全的
所以会出现bug
-=-=-=
我们简单分析一下
hashMap插入一条数据的时候是这样的顺序
1.计算数据的hash值
2.判断hash值是否存在
3.插入值
4.执行size++
当线程1和线程2“同时”执行插入数据1这个操作时,线程1判断1不存在,线程2也判断1不存在,然后线程1插入数据1,线程2也插入数据1,于是出现了2个数据1,但是由于他们的hash值一样,其实占据的是同一个地址
而size++本身也同样不是原子操作,会导致size被多加了一次

hashmap不是线程安全的,在putval最下面有个++size在并发情况下会导致size变量增多,但是实际上还是1w个

并发场景使用ConcurrentHashMap才是正确的

因为Map非线程安全,多个线程同时put时,会导致size的数量不准备,但其实最终key的数量只有1w个

img

你可以最后统计一下key的数量

 HashSet<Integer> set = new HashSet<>();
        for(Map.Entry<Integer,String> entry : map.entrySet()){
            set.add(entry.getKey());
        }
        System.out.println(set.size());