示例如下

        List<String> list = new ArrayList<String>();        for (int i = 0; i < 30; i++) {            new Thread(()->{                list.add(UUID.randomUUID().toString().substring(0, 8));                System.out.println(list);            },String.valueOf(i)).start(); ;            }        }

结果如下:

故障现象

ConcurrentModificationException :当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

解决方案

  1. 方案一:new Vector<>();
  2. 方案二:Collections.synchronizedList(new ArrayList<>())
  3. 方案三:JUC的 new CopyOnWriteArrayList()

导致原因

并发争抢导致,参考花名册签名情况,一个人正在写入,另外一个同学过来抢夺,导致数据不一致异常,并发修改异常

优化建设

CopyOnWrite 写时复制:
往一个容器添加元素的时候,不直接往当前容器Object[]添加,而是先将当前容器Object[]进行copy,只复制出一个新的容器object[] newelements;然后新的容器添加元素,添加完元素之后,再将原有容器的引用指向新的容器setArray(newelements);

这样的好处是可以对CopyOnWrite容器进行并发的读,而不需要枷锁,因为当前容器不会添加任何元素,所有CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器

HashSet 的底层是什么?

1.HashSet的底层是HasMap

 public HashSet() {        map = new HashMap<>();    }

2.使用map的put方法存储,key存具体的值,value存Object对象

   private static final Object PRESENT = new Object();   public boolean add(E e) {        return map.put(e, PRESENT)==null;    }

集合类线程不安全解决的类:

        CopyOnWriteArrayList list;        CopyOnWriteArraySet set;        ConcurrentHashMap map;
©著作权归作者所有:来自51CTO博客作者l363130002的原创作品,如需转载,请注明出处,否则将追究法律责任

好知识,才能预见未来

赞赏

0人进行了赞赏支持

更多相关文章

  1. 我的第一款 Drone 插件
  2. 面试必备,电商系统中并发测试是怎样进行的?
  3. JavaMySQL面试题,如何书写 update 避免表锁?
  4. MySQL:表级锁、行级锁、共享锁、排他锁、乐观锁、悲观锁
  5. Java并发编程学习笔记2
  6. HULK容器镜像仓库简介
  7. Docker容器引擎的安装部署
  8. 降级?限流?程序员双十一过后如何5元花3天?
  9. 携程万台规模容器云平台运维管理实践

随机推荐

  1. 【春节特辑】谁是最后的赢家
  2. 【码破苍穹】第一章:码畜林一
  3. 图解剑指 offer 第三题: 从尾到头打印链表
  4. 1 个自动化脚本搞死公司,是碰瓷么?看后续调
  5. 几道和「堆栈、队列」有关的面试算法题
  6. 推荐三个 VSCode 摸鱼插件
  7. 链表算法面试问题?看我就够了!
  8. 不知这117人会不会也被狗不理报警处理?
  9. 一道看完答案你会觉得很沙雕的「动态规划
  10. 又一套!微软在 GitHub 新发的 Python 视频