gpt4 book ai didi

java - 为什么我无法获取 Failfast 事件和 ConcurrentModificationException

转载 作者:行者123 更新时间:2023-12-02 11:57:31 25 4
gpt4 key购买 nike

以下代码块来自一篇文章,该文章说程序将产生快速失败事件并抛出ConcurrentModificationException,因为多个线程正在通过迭代器修改列表,但我运行它并且运行正常,出了什么问题?

import java.util.*;
import java.util.concurrent.*;


public class FastFailTest {

private static List<String> list = new ArrayList<String>();
public static void main(String[] args) {


new ThreadOne().start();
new ThreadTwo().start();
}

private static void printAll() {
System.out.println("");

String value = null;
Iterator iter = list.iterator();
while(iter.hasNext()) {
value = (String)iter.next();
System.out.print(value+", ");
}
}


private static class ThreadOne extends Thread {
public void run() {
int i = 0;
while (i<6) {
list.add(String.valueOf(i));
printAll();
i++;
}
}
}


private static class ThreadTwo extends Thread {
public void run() {
int i = 10;
while (i<16) {
list.add(String.valueOf(i));
printAll();
i++;
}
}
}

}

最佳答案

如果我执行代码,有时会得到 CME,有时则不会。

下面是我收到异常时的堆栈跟踪和输出。好吧,有一点可以肯定,当两个线程都尝试插入数据时,它们的时间不会相互冲突,因为它们填充列表所花费的时间非常少。我执行了代码并且得到了异常。

由于线程一只能插入 [0,5] 中的值,而线程二只能插入 [10,15] 中的值最后一行输出是 [0, 10, 11, 12, 13, 14, 15, Exception in thread "Thread-0"java.util.ConcurrentModificationException]

我相信线程二已经完成了向列表中插入元素的操作,但是线程一只添加了一个为 0 的元素。

下面是堆栈跟踪。

0, 0, 10, 10, 
0, 10, 11,
0, 10, 11, 12,
0, 10, 11, 12, 13,
0, 10, 11, 12, 13, 14,
0, 10, 11, 12, 13, 14, 15, Exception in thread "Thread-0" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at com.failfast.FastFailTest.printAll(FastFailTest.java:23)
at com.failfast.FastFailTest.access$1(FastFailTest.java:17)
at com.failfast.FastFailTest$ThreadOne.run(FastFailTest.java:34)

关于java - 为什么我无法获取 Failfast 事件和 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47484230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com