复制代码

【08】同步容器 VS ConcurrentModificationExceotion

java 集合框架有 List Set Queue Map ,而前三个是实现了Collection 接口

  所以就有了传说中的同步容器 包装了一层同步锁 ,Vector Stack HashTable

这时候 会在迭代遍历时产生一个问题,就是ConcurrentModificationException (同步修改异常)

  产生是因为迭代器,在一次内部元素修改时,会被修改,然后就throw Exception

看代码

package Concurrency.mid;

import leetcoder.ListNode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class Test {
    public static void main(String[]arg){
         

        List<String> list = new ArrayList<String>();
        list.add("1");
        list.add("2");
        list.add("3");

        System.out.println(list);
/*
        // 方式 1   Exception in thread "main" java.util.ConcurrentModificationException
        Iterator it = list.iterator();
        while(it.hasNext()){
            String s = (String) it.next();
            if(s=="1"){
                list.remove(s);
            }
        }

        //方式二
        for(Iterator it2 = list.iterator();it2.hasNext();){
            String s = (String)it2.next();
            if(s == "1")
            {
                list.remove(s);
            }
        }
        //方式三
        for(String s :list){
            if(s=="1"){
                list.remove(s);
            }
        }
  */
    /** 解决方案 使用迭代器 删除*/

        for(Iterator it2 = list.iterator();it2.hasNext();){
            String s = (String)it2.next();
            if(s == "1")
            {
                it2.remove();
            }
        }
        System.out.println(list);
        // 二 使用removeAll 删除

        List list2 = new ArrayList();
        list2.add("2");
        list.removeAll(list2);
        System.out.println(list);
        // 三 使用 CopyOnWriteArrayList

        List list3 = new CopyOnWriteArrayList();
        list3.add("1");
        list3.add("2");
        list3.add("3");
        list3.add("4");

        Iterator it4 = list3.iterator();
        while(it4.hasNext()){
            String s = (String)it4.next();
            if(s=="1"){
               list3.remove(s);
            }
        }

        //四 使用索引下标
        for(int i=0;i<list3.size();i++){
            String s  = (String) list3.get(i);
            if(s=="2"){
                list3.remove(s);
                --i;
            }
        }


    }
}
View Code

解决方案

1.使用迭代器删除

2.记录然后删除

3.使用CopyOnWriteArrayList 容器

4.使用索引下标(此时不涉及迭代器,所以适用于多线程)

posted @ 2018-12-01 18:32  pg633  阅读(138)  评论(0编辑  收藏  举报