美文网首页
fail-fast机制

fail-fast机制

作者: 阿长_一个程序员 | 来源:发表于2019-03-08 10:34 被阅读0次

在遍历中,如果出现了意料之外的修改,会抛出ConcurrentModificationException,这个机制主要目的是避免多个线程对同一个集合的内容进行操作而导致集合内数据的混乱。但是这个机制会给我们带来一些困扰

比如使用增强for循环遍历数组同时进行修改时

List<Integer> numList = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
       for (Integer i : numList) {
           if (i == 3) {
               下面两个语句都会报错
               numList.add(3);
               numList.remove(3);
           }
       }

它的机制是这样的,集合中持有一个int类型的字段modCount,集合内的数据发生变动(增加,删除,排序等等)时,modCount 会改变

public E remove(int index) {
        rangeCheck(index);
        
        modCount++; 看到modCount变化了吧

        E oldValue = elementData(index);
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,  numMoved);
            elementData[--size] = null; // clear to let GC do its work
       return oldValue;
    }

集合的某些方法里(遍历,排序等等)会检查expectedModCountmodCount是否相等,如果不相等,说明在方法在运行的过程中数据发生了变动,就会抛出ConcurrentModificationException。

public void sort(Comparator<? super E> c) {
        final int expectedModCount = modCount; 先让它们俩相等

        Arrays.sort((E[]) elementData, 0, size, c);

        if (modCount != expectedModCount) { 如果modCount发生了变动,抛异常
            throw new ConcurrentModificationException();
        }
        modCount++;  数据变动后,修改modCount
    }

如果我们想在遍历集合的同时对集合进行修改,我们就得使用不会检查modCount的遍历方式。

下面的方法可以满足这样的需求

List<Integer> numList = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));

方式一
Iterator<Integer> it = numList.iterator();
       while(it.hasNext()) {
           if (it.next() == 3) {
               it.remove();
           }
       }

方式二
for (int i = 0; i < numList.size(); i++) {
           if (numList.get(i) == 3) {
               numList.remove(i);
           }
       }

相关文章

  • Fail-Fast和Fail-Safe机制

    1 Fail-Fast 1.1 fail-fast定义 fail-fast 机制是java集合(Collectio...

  • fail-fast 与 fail-safe

    先说说什么是fail-fast fail-fast 机制是java集合(Collection)中的一种错误机制。在...

  • Java fail-fast 和 fail-safe机制

    Java fail-fast 和 fail-safe机制 基本概念 fail-fast 和 fail-safe这两...

  • fail-fast与fail-safe机制

    fail-fast fail-fast机制在遍历一个集合时,当集合结构被修改,会抛出ConcurrentModif...

  • fail-fast机制, ArrayList, LinkedLi

    fail-fast机制:Iterator的concurrentModifiedException 在迭代器生成后一...

  • Fail-Fast:Java集合错误检测机制

    一、简介fail-fast,即快速失败,Java集合的一种错误检测机制。当多个线程对集合(非fail-fast的集...

  • Fail-Fast 机制

    简介 fail-fast 机制是 java 集合(Collection)中的一种错误机制。 当多个线程对同一个集合...

  • fail-fast 机制

    什么是fail-fast 它是Java集合的一种错误检测机制。当多个线程对集合进行结构上的改变的操作时,有可能会产...

  • fail-fast机制

    1.概念 fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的...

  • fail-fast机制

    fail-fast机制是java集合中的一种错误机制。当使用迭代器迭代时,如果发现集合有修改,则快速失败做出响应,...

网友评论

      本文标题:fail-fast机制

      本文链接:https://www.haomeiwen.com/subject/pzkhpqtx.html