【发布时间】:2025-11-25 16:30:01
【问题描述】:
有很多并发的 mod 异常问题,但我找不到帮助我解决问题的答案。如果您找到答案,请提供链接,而不是仅仅投反对票。
所以我最初在尝试搜索 arraylist 并删除元素时遇到了并发 mod 错误。有一段时间,我通过创建第二个数组列表,将发现的元素添加到其中,然后在 for 循环之外使用 removeAll() 来解决它。这似乎可行,但是当我使用 for 循环从多个文件中导入数据时,我再次开始收到并发修改异常,但由于某种原因间歇性出现。任何帮助将不胜感激。
这是有问题的具体方法(以及它调用的其他方法......):
public static void removeData(ServiceRequest r) {
readData();
ArrayList<ServiceRequest> targets = new ArrayList<ServiceRequest>();
for (ServiceRequest s : serviceQueue) {
//ConcurrentModification Exception triggered on previous line
if (
s.getClient().getSms() == r.getClient().getSms() &&
s.getTech().getName().equals(r.getTech().getName()) &&
s.getDate().equals(r.getDate())) {
JOptionPane.showMessageDialog(null, s.getClient().getSms() + "'s Service Request with " + s.getTech().getName() + " on " + s.getDate().toString() + " has been removed!");
targets.add(s);
System.out.print("targetted"); }
}
if (targets.isEmpty()) { System.out.print("*"); }
else {
System.out.print("removed");
serviceQueue.removeAll(targets);
writeData(); }
}
public static void addData(ServiceRequest r) {
readData();
removeData(r);
if (r.getClient().getStatus().equals("MEMBER") || r.getClient().getStatus().equals("ALISTER")) {
serviceQueue.add(r); }
else if (r.getClient().getStatus().equals("BANNED") || r.getClient().getStatus().equals("UNKNOWN")) {
JOptionPane.showMessageDialog(null, "New Request failed: " + r.getClient().getSms() + " is " + r.getClient().getStatus() + "!", "ERROR: " + r.getClient().getSms(), JOptionPane.WARNING_MESSAGE);
}
else {
int response = JOptionPane.showConfirmDialog(null, r.getClient().getSms() + " is " + r.getClient().getStatus() + "...", "Manually Overide?", JOptionPane.OK_CANCEL_OPTION);
if (response == JOptionPane.OK_OPTION) {
serviceQueue.add(r); }
}
writeData(); }
public static void readData() {
try {
Boolean complete = false;
FileReader reader = new FileReader(f);
ObjectInputStream in = xstream.createObjectInputStream(reader);
serviceQueue.clear();
while(complete != true) {
ServiceRequest test = (ServiceRequest)in.readObject();
if(test != null && test.getDate().isAfter(LocalDate.now().minusDays(180))) {
serviceQueue.add(test); }
else { complete = true; }
}
in.close(); }
catch (IOException | ClassNotFoundException e) { e.printStackTrace(); }
}
public static void writeData() {
if(serviceQueue.isEmpty()) { serviceQueue.add(new ServiceRequest()); }
try {
FileWriter writer = new FileWriter(f);
ObjectOutputStream out = xstream.createObjectOutputStream(writer);
for(ServiceRequest r : serviceQueue) { out.writeObject(r); }
out.writeObject(null);
out.close(); }
catch (IOException e) { e.printStackTrace(); }
}
编辑
更改导致并发模块每次触发而不是间歇性触发,我猜这意味着删除代码更好,但错误现在在it.remove();触发
public static void removeData(ServiceRequest r) {
readData();
for(Iterator<ServiceRequest> it = serviceQueue.iterator(); it.hasNext();) {
ServiceRequest s = it.next();
if (
s.getClient().getSms() == r.getClient().getSms() &&
s.getTech().getName().equals(r.getTech().getName()) &&
s.getDate().equals(r.getDate())) {
JOptionPane.showMessageDialog(null, s.getClient().getSms() + "'s Service Request with " + s.getTech().getName() + " on " + s.getDate().toString() + " has been removed!");
it.remove(); //Triggers here (line 195)
System.out.print("targetted"); }
}
writeData(); }
线程“AWT-EventQueue-0”中的异常 java.util.ConcurrentModificatio 异常 在 java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) 在 java.util.ArrayList$Itr.next(ArrayList.java:851) 在 data.ServiceRequest.removeData(ServiceRequest.java:195) 在 data.ServiceRequest.addData(ServiceRequest.java:209) <...>
编辑 经过一番搜索,我将 for 循环切换为:
Iterator<ServiceRequest> it = serviceQueue.iterator();
while(it.hasNext()) {
它又回到了间歇性触发状态。我的意思是我第一次尝试导入数据(从 addData 方法触发 removeData 方法)它会触发并发 mod 异常,但下一次尝试它会推动失败并移至另一个文件。我知道有很多这些并发的 mod 问题,但我没有找到任何对我的情况有帮助的东西,所以非常欢迎链接到其他答案......
【问题讨论】:
-
“用于从多个文件导入数据的 for 循环”您可以发布吗?还有,为什么一切都是
static而serviceQueue又是什么? -
堆栈跟踪,异常行数,有多少项,异常中的模式..基本上更多细节,请。
-
我使用注释文本标记了堆栈跟踪捕获的行,这也恰好是失败的 for 循环。感谢您及时的回复。 @RC serviceQueue 是所有已生成的 ServiceRequest 的 ArrayList
,与 xml 文件匹配。 -
你不能用队列(如ArrayDeque)代替List(如ArrayList)吗?
-
我不熟悉 ArrayDeque。现在搜索,有没有推荐的链接@NyamiouTheGaleanthrope?
标签: java for-loop arraylist concurrentmodification