• 增强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自己就迷失了方向。
  • 相关阅读:
    [原创] 毕设---在myeclipes中安装Hadoop开发插件
    [转]Linux下RPM软件包的安装及卸载 yum操作
    [转]结构化、半结构化和非结构化数据
    [转]这5种必知的大数据处理框架技术
    [转]浅谈Hive vs. HBase 区别在哪里
    前端资源整理
    每个程序员都应该知道的10大基础算法
    Python Day14(HTML)
    Python Day13(yaml)
    Python Day12(补充)
  • 原文地址:https://www.cnblogs.com/huqi96/p/14394977.html
Copyright © 2020-2023  润新知