gpt4 book ai didi

java - 这是防止 ConcurrentModificationException 的好方法吗

转载 作者:行者123 更新时间:2023-12-01 19:20:11 26 4
gpt4 key购买 nike

另一个问题是关于同步的。我在 Note 类中还有一个 run() ,因为我想每 5 分钟输出一次 Notes 中的每个元素。但我总是遇到异常:java.util.ConcurrentModificationException,如果我尝试在 main 中进行更多 session 。所以我的应用程序同步到列表笔记,当我迭代笔记时,可能会添加一个新的 session 。我的运行方法如下:

在列表注释上进行同步以防止 ConcurrentModificationException 的正确方法吗?(在我的程序中它有效。我现在从未遇到过此异常)

session 类和笔记类可能会喜欢这样:

public class Meeting{

public Meeting(Note note_1,Note note_2){

note_1.addElement(this);

note_2.addElement(this);}

//another method hier

}

public class Note implements Runnable{

public final List<Meeting> notes = new ArrayList<Meeting>();

public void addElement(Meeting n){

entries.add(n);
}

@Override

public void run(){
while(true) {
for(Meeting n : notes){

System.out.println(n.toString);}

}

try{ Thread.sleep(10);}

}

}
}

如果我尝试在 main 中进行更多 session ,我总是会收到有关 exception:java.util.ConcurrentModificationException 的异常错误,因此我在类注释中更改了一些内容,喜欢这个:

  private  static final List<Entry> entries = Collections.synchronizedList(new ArrayList<Entry>());

并在 run() 中

@Override
public void run() {
while(true){
synchronized(notes){
for(Entry n : entries){
//do something
}
}
try {
Thread.sleep(10);
} catch (InterruptedException e ) {
}
}
}

}

最佳答案

来自 javadoc

请注意,此异常并不总是表明对象已被不同的线程同时修改。如果单个线程发出一系列违反对象约定的方法调用,则该对象可能会抛出此异常。例如,如果线程在使用快速失败迭代器迭代集合时直接修改集合,则迭代器将抛出此异常。

这意味着即使在同一线程中,也不要在循环中更改集合并同时迭代它。

关于java - 这是防止 ConcurrentModificationException 的好方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4679800/

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