gpt4 book ai didi

java - 在多线程环境下使用for循环避免ConcurrentModificationException

转载 作者:行者123 更新时间:2023-12-02 01:39:04 25 4
gpt4 key购买 nike

据我所知,类似的问题以前也曾被问过。我还有一个问题。

我继承了如下代码。它使用迭代器循环列表。该循环似乎没有对列表进行任何更改。调用 next() 方法时会发生异常。这是 Eclipse RCP 代码。另一个线程可能正在修改列表。

for (Iterator iter = mylist.iterator(); iter.hasNext();) {
MyItem myItem = (MyItem) iter.next(); // ConcurrentModificationException happens here
.
.
.
}

我尝试将代码放入同步块(synchronized block)中,但没有解决问题。但是当我将其更改为常规 for 循环时,我没有得到异常。

int list_size = myList.size();
for (int i = 0; i < list_size; i++) {
MyItem myItem = (MyItem) myList.get(i);
.
.
.
}

即使我在这里没有遇到异常,当上面的 for 循环正在进行时,列表是否仍然可以被另一个线程修改?如果是这样,我的选择是什么?如果我将 for 循环放在同步块(synchronized block)中,是否可以保证循环进行时列表不会被修改?

最佳答案

如果您的应用程序是 SingleThread,我建议您检查您的代码,因为这在正常情况下不会发生。

如果您的应用程序是多线程应用程序,那么您可以将列表放入 CopyOnWriteArrayList 类中,如下所示。看看:

示例:

import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import static java.lang.System.out;

public class MyClass {
public static void main(String[] args) {
List<Integer> unsynchronizedList =
IntStream.rangeClosed(0, 100)
.boxed()
.collect(Collectors.toList());

final CopyOnWriteArrayList<Integer> synchronizedList = new CopyOnWriteArrayList<>(unsynchronizedList);

Thread thread = new Thread(new ListIteratorThread(synchronizedList));
thread.start();

for (Integer number : synchronizedList) {
out.println("Main thread says: " + number);
}
}

static class ListIteratorThread implements Runnable {
private List<Integer> listToIterate;

ListIteratorThread(List<Integer> listToIterate) {
this.listToIterate = listToIterate;
}

@Override
public void run() {
final Iterator<Integer> iterator = listToIterate.iterator();
Integer number = null;

while (iterator.hasNext()) {
number = iterator.next();
}

if (number % 2 == 0) {
listToIterate.remove(number);
}
}
}
}

希望对你有帮助:)

关于java - 在多线程环境下使用for循环避免ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57499323/

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