当我尝试将消息写入文件时,java.util.ConcurrentModificationException

当我尝试将消息写入文件时,java.util.ConcurrentModificationException,java,Java,我是一名Java开发新手。我想用GUI编写电子邮件客户端,但在尝试运行WriteMessagesthread时遇到问题。我正在使用JavaMail库 public class WriteMessages implements Runnable { private List<Message> list; private Properties properties; private Utilities util = new Utilities(); p

我是一名Java开发新手。我想用GUI编写电子邮件客户端,但在尝试运行
WriteMessages
thread时遇到问题。我正在使用JavaMail库

public class WriteMessages implements Runnable {

    private List<Message> list;
    private Properties properties;
    private Utilities util = new Utilities();

    public WriteMessages(List<Message> list, Properties properties) {
        this.list = list;
        this.properties = properties;
    }

    @Override
    public void run() {

        Iterator<Message> iter = list.iterator();
        while (iter.hasNext()) {

            Message m = iter.next(); //line 42 exception occurs there

            String name = Morda.produceFileName(m);

            File file = new File(properties.getProperty("PathToMessages") + "//" + name);
            try {
                file.createNewFile();
            } catch (IOException ex) {
            }

            try (OutputStream os = new FileOutputStream(file);){
                m.writeTo(os);
                System.out.println("File " + file.getName() + " was wrote succesfuly");
            } catch (IOException | MessagingException ex) {
            }
        }
    }
}
但是,当我删除这段代码时:

try (OutputStream os = new FileOutputStream(file);){
    m.writeTo(os);
    System.out.println("File " + file.getName() + " was wrote succesfuly");
} catch (IOException | MessagingException ex) {
}
异常没有出现。我想这个问题已经解决了,但我不知道怎么解决。请帮我解决这个问题。
谢谢。

我怀疑另一个线程正在访问列表,而该线程正在迭代列表中的消息。这是因为列表引用是共享的,并在其构造函数中传递给线程

每当列表对象在此线程或其他线程中使用时,请尝试对其进行同步。您可以使用同步列表:

List<Message> messageList = Collections.synchronizedList(list);

你应该能够通过同步这个线程产生的方法的访问来解决这个问题。

< P>我认为这可能是因为你用其他线程中的消息修改列表,而因为ARARYLIST不是线程安全的,你应该考虑另一个列表实现。
对于线程安全的实现,可以在并发环境中读取更多的

,考虑使用简单的<代码> ARARYLIST//C>。当您开始迭代它时,您将迭代迭代开始时列表的内容。通常这是人们想要的行为。使用
Collections.synchronizedList
实际上无助于防止
ConcurrentModificationException
,可能会降低应用程序的响应速度。

谢谢您的回答,但这没有任何效果。谢谢。它帮助我解决了这个问题。谢谢,问题解决了。谢谢大家的帮助。我使用@TagirValeev的建议,简单地将
ArrayList
替换为
CopyOnWriteArrayList
,一切正常。
List<Message> messageList = Collections.synchronizedList(list);
synchronized(messageList) {
    Iterator<Message> iter = messageList.iterator();
    while (iter.hasNext()) {
        ...
    }
}