java fail 方法_Java集合-05fail-fast(快速失败)机制原理及解决方法

本文详细分析了Java中并发修改异常ConcurrentModificationException的产生原因,通过一个示例代码展示了在多线程环境下遍历并修改集合时导致的问题。主要涉及到线程安全和迭代器的使用,解释了为何在并发环境下直接修改集合结构会导致异常,并提供了相关解决方案。
摘要由CSDN通过智能技术生成

public class FailFastMultiThread {

private static List lists = new ArrayList<>(10);

static {

for (int i = 0; i < 4; i++){

lists.add(String.valueOf(i));

}

}

public static void main(String[] args) {

new Thread(new ForEachThread()).start();

new Thread(new EditThread()).start();

}

//用于遍历

static class ForEachThread implements Runnable{

@Override

public void run() {

Iterator iterator = lists.iterator();

while (iterator.hasNext()){

System.out.println(iterator.next());

try {

Thread.sleep(100);//为了另外的线程加入,也是为了结合在遍历时候修改结构

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

//用于修改结构

static class EditThread implements Runnable{

@Override

public void run() {

lists.add("8");

}

}

}

//output:Exception in thread "Thread-0" java.util.ConcurrentModificationException

产生原因//省略部分方法

private class Itr implements Iterator {

int cursor; // index of next element to return

int lastRet = -1; // index of last element returned; -1 if no such

int expectedModCount = modCount;

@SuppressWarnings("unchecked")

public E next() {

checkForComodification();

int i = cursor;

if (i >= size)

throw new NoSuchElementException();

Object[] elementData = ArrayList.this.elementData;

if (i >= elementData.length)

throw new ConcurrentModificationException();

cursor = i + 1;

return (E) elementData[lastRet = i];

}

public void remove() {

if (lastRet < 0)

throw new IllegalStateException();

checkForComodification();

try {

ArrayList.this.remove(lastRet);

cursor = lastRet;

lastRet = -1;

expectedModCount = modCount;

} catch (IndexOutOfBoundsException ex) {

throw new ConcurrentModificationException();

}

}

final void checkForComodification() {

if (modCount != expectedModCount)

throw new ConcurrentModificationException();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值