首页 > 编程语言 > 详细

我们知道ArrayList是线程不安全,请设计一个不安全的案例并给出解决方案?

时间:2021-03-21 22:57:02      阅读:60      评论:0      收藏:0      [点我收藏+]
示例如下
        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;

我们知道ArrayList是线程不安全,请设计一个不安全的案例并给出解决方案?

原文:https://blog.51cto.com/liuyj/2667451

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!