ConcurrentModificationError - 但没有修改?

时间:2017-02-03 09:39:12

标签: java android concurrentmodification

我有这段代码:

public static final ReentrantLock lock = new ReentrantLock();

public static void sendMessage(final ArrayList<String> JIDs, final String text) {
    synchronized (MainActivity.getContext()) {
        if (JIDs != null) {
            lock.lock();
            try {
                Runnable r = new Runnable() {
                    public void run() {
                        if (Looper.myLooper() == null) {Looper.prepare();}
                        for (String JID : JIDs) {
                            if (JID != null) {
                                Intent sendIntent = new Intent();
                                sendIntent.setAction("message.platform.SEND_MESSAGE");
                                sendIntent.putExtra("jid", JID);
                                sendIntent.putExtra("content", text);
                                MainActivity.getContext().sendBroadcast(sendIntent);
                            }
                            try {
                                Thread.sleep(300);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                };
                Thread t = new Thread(r);
                t.start();
                try {t.join();} catch (InterruptedException e) {e.printStackTrace();}
            } finally {
                lock.unlock();
            }
        }
    }
}

它应该做的是迭代不同JID的列表并向每个JID发送相同的消息,每个消息之间有300ms的延迟。此过程必须同步并锁定,因为我不希望多个线程同时访问此代码。它还在执行此代码时在另一个线程上运行,因为需要300ms的延迟(不想在UI上执行此操作)。

但是,在成功运行此代码多个小时后,此错误总是出错:

java.util.ConcurrentModificationException
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)

然后在我的方法中指出这段代码:

>>> for (String JID : JIDs) {

就我而言,我不会以任何形式或形式修改此列表......发生了什么?为什么它会工作几个小时,然后随机吐出这个错误?提前谢谢!

修改

我这样称呼方法:

sendMessage(new ArrayList<String>(Arrays.asList("jid1","jid2")),"Hello everyone!");

0 个答案:

没有答案