zoukankan      html  css  js  c++  java
  • 增强for循环对遍历的集合进行增删改操作会出现并发修改异常

    import lombok.Data;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author huQi
     * @email
     * @data 2021/2/9 17:46
     */
    public class test {
        public static void main(String[] args) {
            List<Student> a = new ArrayList<Student>();
            for (int i = 0; i < 10; i++) {
                Student student = new Student();
                student.setAge(i);
                student.setName("huqi");
                a.add(student);
            }
            for (Student student : a) {
                if (student.getAge().intValue() == 2) {
                    //使用增强for循环的时候对遍历的集合进行增删改操作会出现并发修改异常
                    a.remove(student);
                }
            }
    
            System.out.println(a.toString());
    
        }
    }
    
    @Data
    class Student {
        Integer age;
        String name;
    }

    以上示例正确写法用普通for循环或者用java 8提供的removeif,或者使用线程安全的集合

    示例代码

    import lombok.Data;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author huQi
     * @email
     * @data 2021/2/9 17:46
     */
    public class test {
        public static void main(String[] args) {
            List<Student> a = new ArrayList<Student>();
            for (int i = 0; i < 10; i++) {
                Student student = new Student();
                student.setAge(i);
                student.setName("huqi");
                a.add(student);
            }
            //正确写法
            a.removeIf(s -> s.getAge() == 2);
    
            System.out.println(a.toString());
    
        }
    }
    
    @Data
    class Student {
        Integer age;
        String name;
    }

    线程安全的集合

            Collection<Student> list = Collections.synchronizedCollection(new ArrayList<Student>());
            List<Student> list1 = new CopyOnWriteArrayList<>();
            List<Student> list2 =new Vector<>();

    总结:

    Iterator是工作在一个独立的线程中,并且拥有一个 mutex锁,就是说Iterator在工作的时候,
    是不允许被迭代的对象被改变的。Iterator被创建的时候,建立了一个内存索引表(单链表),
    这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,
    所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错 误。List、Set等是动态的,
    可变对象数量的数据结构,但是Iterator则是单向不可变,只能顺序读取,不能逆序操作的数据结构,
    当 Iterator指向的原始数据发生变化时,Iterator自己就迷失了方向。
  • 相关阅读:
    十张伟大的科学瞬间
    机器学习如何破译早已消亡的古老语言?
    如何阻止「数码黑帮」偷走你的时间
    社会地位即服务, Status as a Service (二): 社交网络的投资回报率 (ROI)
    谁是你的创业竞争对手?
    酷!美国国家安全局(NSA)开源了逆向工程工具 Ghidra
    Linux终端下Ctrl+S卡死
    操作系统损坏重装是否能恢复lvm硬盘数据的相关实验
    How to write an iso file to usb driver
    linux screen的用法
  • 原文地址:https://www.cnblogs.com/huqi96/p/14394977.html
Copyright © 2011-2022 走看看