集合不安全之 ---> Set

Set 作为一个接口,它的实现类中主要是hashset,在多线程操作set的时候会出现问题,一下为一个列子

 public static void main(String[] args) throws Exception {

        Set<String> set = new HashSet<>();

        for (int i = 0;i<30;i++){
            new Thread(()->{
                set.add(Thread.currentThread().getName());
                System.out.println(Thread.currentThread().getName()+"\t"+set);
            }).start();
        }
    }

//运行结果如下:多线程共同修改set集合,造成了并发修改异常
java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
    at java.util.HashMap$KeyIterator.next(HashMap.java:1469)
    at java.util.AbstractCollection.toString(AbstractCollection.java:461)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at juc.ContainerNotSafeDemo.lambda$main$0(ContainerNotSafeDemo.java:17)
    at java.lang.Thread.run(Thread.java:748)

 

解决方案如下:

  1. - 使用Vector类
  2. - 使用Collections.synchronizedSet()方法,参数为一个Set对象
  3. - 使用CopyOnWriteArraySet类
  4. > CopyOnWriteArraySet类的底层使用了CopyOnWriteArrayList类

CopyOnWriteArraySet的构造器,用的还是写时赋值技术,上篇list写过,这里不再描述

 

posted @ 2020-04-20 10:50  IT路上的小白  阅读(202)  评论(0编辑  收藏  举报