Java并发HashMap报错ConcurrentModificationException解决方案

HashMap

HashMap是散列表存储,采用key-value键值对存储数据,其中k用hash散列函数找到存储位置,为的就是减少查找比较次数,特点: 无序,key不可重复,key可以为null,value可重复,线程不安全.JDK1.7底层是采用数组+链表,hash碰撞后采用拉链法来解决碰撞问题.JDK1.8底层采用数组+链表+红黑树,链表长度大于等于8且容量大于等于64就会树化,否则会反树化.

案例代码

public class HashMapConcurrentDemo {

    public static void main(String[] args) {

        Map<String,String> list = new HashMap<>();

        for (int i = 0; i < 30
                ; i++) {
            new Thread(()->{
                list.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,8));
                System.out.println(list);
            },"t"+i).start();
        }
    }
}

导致原因

高并发情况下,多个线程竞争put操作
在这里插入图片描述

解决方案

  1. Collections.synchronizedMap
    底层是采用synchronized同步代码块,包装了最外层的put方法,让其线程安全,其实真正的put操作还是HashMap自己来实现.
    在这里插入图片描述
    在这里插入图片描述
  2. ConcurrentHashMap
    底层是采用分段锁来保证线程安全,其中有CAS乐观锁,和synchronized同步代码块来保证线程安全
    在这里插入图片描述
    在这里插入图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值