首页 > 其他 > 详细

集合类不安全之并发修改异常

时间:2021-07-02 09:27:01      阅读:18      评论:0      收藏:0      [点我收藏+]

1.首先运行这两段代码会抛出一个java.util.ConcurrentModificationException的异常

public class ContainerNotSafeDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                list.add(UUID.randomUUID().toString().substring(0, 8));
                System.out.println(list);
            }, "线程--"+i).start();
        }
    }
}
public class IteratorNotSafeDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("zzz");
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String next = iterator.next();
            if ("zzz".equals(next)) {
                list.remove(next);
            }
        }
    }
}

多线程给list添加值会导致ConcurrentModificationException; 当list迭代中去移除list中的元素时也会导致ConcurrentModificationException。

2.线程不安全问题的解决方法:

  a.把ArrayList换成Vector集合(vector.add()方法中由synchronized修饰)

  b.使用Collections.synchronizedList(new ArrayList());

  c.使用CopyOnWriteArrayList类(写时复制)

技术分享图片

技术分享图片 

3.Set的线程不安全?

与List的线程安全一样:java.util.ConcurrentModificationException

解决方式:

  a.Collections.synchronizedSet(new HashSet());

  b.使用CopyOnWriteHashSet

 4.HashSet的底层原理?

  底层使用HashMap实现,HashSet的value就是HashMap的key值,Map中所有的key值都是一个PRESENT的Object常量

技术分享图片

技术分享图片 

技术分享图片

  5.Map的线程不安全?

与List和Set一样:java.util.ConcurrentModificationException

解决方式:

  a.Collections.synchronizedMap(new HashMap());

  b.使用ConcurrentHashMap

集合类不安全之并发修改异常

原文:https://www.cnblogs.com/zhouxuezheng/p/14961621.html

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