gpt4 book ai didi

java - 静态同步方法中的 ConcurrentModificationError

转载 作者:行者123 更新时间:2023-12-02 08:51:48 28 4
gpt4 key购买 nike

我有一个类,其中包含一个字段和两个静态同步方法。该字段是一个映射,其键是整数,值是列表。其中一种方法用于在列表中添加新项目,另一种方法用于读取列表中的所有项目。我有多个线程来读取和写入 map 。我删除了代码中的一些细节,因此我们假设 key 始终在 map 中。

据我了解,只有一个线程可以同时进入writeread,因为它们都被声明为static synchronized 。这意味着当一个线程正在写入某些内容时,其他线程无法写入或读取,反之亦然。但是为什么迭代器在 for(int item: map.get(我))?谁能解释一下原因是什么?预先感谢!

class A {
private static Map<Integer, List<Integer>> map;

public static synchronized void write(int i, int item) {
map.get(i).add(item);
}

public static synchronized void read(int i) {
for(int item: map.get(i)) System.out.println(item);
}
}

最佳答案

我认为,在您的代码中的某个位置, map 所持有的列表存在并发修改。我编写了一段小代码,它抛出相同的 ConcurrentModificationException:

public class A {
private static Map<Integer, List<Integer>> map = new HashMap<>();

public static synchronized void write(int i, int item) {
if (map.containsKey(i))
map.get(i).add(item);
else {
ArrayList<Integer> list = new ArrayList<>();
list.add(item);
map.put(i, list);
}
}

public static synchronized void read(int i) {
for (int item : map.get(i))
System.out.println(item);
}

public static void main(String[] args) {
Runnable writeAction = () -> A.write(1, 1);
Runnable readAction = () -> A.read(1);
Runnable modifyAction = () -> A.modifyList(1, 2);

ExecutorService service = Executors.newFixedThreadPool(4);
for (int i = 0; i < 1_000; i++) {
service.execute(writeAction);
service.execute(readAction);
service.execute(modifyAction);
}

service.shutdown();
}

/**
* not synchronized
* @param i
* @param item
*/
public static void modifyList(int i, int item) {
if (map.containsKey(i))
map.get(i).add(item);
else {
ArrayList<Integer> list = new ArrayList<>();
list.add(item);
map.put(i, list);
}
}

}

当池中的两个线程同时运行modifyList()和read()方法时,这段代码肯定会抛出异常。

所以要么你的类中有一个不同步的方法,要么可能有一些 getter 返回原始列表的引用而不是它的副本(我的意思是转义引用)以及它返回到的任何方法 - 他们正在修改列表并同时进行。

关于java - 静态同步方法中的 ConcurrentModificationError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60725887/

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