gpt4 book ai didi

java - 尝试在 Java 中使用多线程对 Arraylist 的数字求和时出现 ConcurrentModificationException

转载 作者:行者123 更新时间:2023-11-30 01:48:50 30 4
gpt4 key购买 nike

我对多线程总体来说是新手,所以我仍然不完全理解它。我不明白为什么我的代码有问题。我正在尝试使用前 1000 个数字填充 ArrayList,然后使用三个线程对所有数字求和。

public class Tst extends Thread {
private static int sum = 0;
private final int MOD = 3;
private final int compare;
private static final int LIMIT = 1000;
private static ArrayList<Integer> list = new ArrayList<Integer>();

public Tst(int compare){
this.compare=compare;
}

public synchronized void populate() throws InterruptedException{
for(int i=0; i<=Tst.LIMIT; i++){
if (i%this.MOD == this.compare){
list.add(i);
}
}
}

public synchronized void sum() throws InterruptedException{
for (Integer ger : list){
if (ger%MOD == this.compare){
sum+=ger;
}
}
}

@Override
public void run(){
try {
populate();
sum();
System.out.println(sum);
} catch (InterruptedException ex) {
Logger.getLogger(Tst.class.getName()).log(Level.SEVERE, null, ex);
}
}

public static void main(String[] args) {
Tst tst1 = new Tst(0);
tst1.start();
Tst tst2 = new Tst(1);
tst2.start();
Tst tst3 = new Tst(2);
tst3.start();
}
}

我期望它打印“500.500”,但它打印的是:

162241
328741
Exception in thread "Thread-0" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:996)
at tst.Tst.sum(Tst.java:38)
at tst.Tst.run(Tst.java:50)
BUILD SUCCESSFUL (total time: 2 seconds)

最佳答案

问题的发生是因为你的方法是在“对象级别”同步的,我的意思是,它使用的监视器锁是特定对象的(tst1,tst2,tst3)。换句话说,每个同步方法都使用不同的锁。将同步方法更改为静态作为修复它的第一步。

关于java - 尝试在 Java 中使用多线程对 Arraylist 的数字求和时出现 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56812617/

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