zoukankan      html  css  js  c++  java
  • 集合不安全之 ---> 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()+"	"+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写过,这里不再描述

  • 相关阅读:
    Flutter高仿微信项目开源-具即时通讯IM功能
    flutter 如何实现文件读写(使用篇)
    这是我的第一篇博客,测试文章
    对于ServiceManager的理解
    Class文件结构
    App进程的启动
    对于SystemServer的理解
    对于Zygote的理解
    Git内部原理浅析
    二叉搜索树(BST)基本操作
  • 原文地址:https://www.cnblogs.com/cb1186512739/p/12736420.html
Copyright © 2011-2022 走看看