情况1:这不会导致ConcurrentModificationException
?谁能告诉我为什么这不会导致ConcurrentModificationException。任何人都可以通过ConcurrentModificationException解释我吗?
public class UpdatePeople {
List <People> records = new ArrayList <People>();
public class AsyncTask extends AsyncTask < Void, Void, Boolean > {
List <People> people;
public AsyncTask(List <People> allergy) {
this.people = people;
}@
Override
protected Boolean doInBackground(Void...params) {
List <String> responses = new ArrayList <String>();
for (People peopleList: this.people) {
}
}
}
}
案例2:这会导致ConcurrentModificationException
因为我试图访问的人在我AsyncThread这不是线程安全的列表。我可以让我的人员列表实现CopyOnWriteArrayList
这是线程安全的,这应该工作。
public class UpdatePeople {
List <People> records = new ArrayList <People>();
public class AsyncTask extends AsyncTask < Void, Void, Boolean > {
@
Override
protected Boolean doInBackground(Void...params) {
List <String> responses = new ArrayList <String>();
for (People peopleList: records) {
}
}
}
}
- 任何人都可以解释我什么是
case 1
恰好发生。我无法理解这是如何解决ConcurrentModificationException
问题的。 - 是否将案例2从
ArrayList
更改为CopyOnWriteArrayList
推荐?
添加异常:
05-28 20:34:21.073:E/XXX(904):未捕获的例外情况是:05-28 20:34:21.073:E/XXX(904):了java.lang.RuntimeException:一个错误而执行doInBackground发生 ()05-28 20:34:21.073:E/XXX(904):在 android.os.AsyncTask $ 3.done(AsyncTask.java :299)05-28 20:34:21.073: E/XXX(904):at java.util.concurrent.FutureTask $ Sync.innerSetException(FutureTask.java:273) 05-28 20:34:2 1.073:E/XXX(904):at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 05-28 20:34:21.073:E/XXX(904):at java.util。 concurrent.FutureTask $ Sync.innerRun(FutureTask.java:307) 05-28 20:34:21.073:E/XXX(904):在 java.util.concurrent.FutureTask.run(FutureTask.java:137)05 -28 20:34:21.073:E/XXX(904):在 android.os.AsyncTask $ $ SerialExecutor 1.run(AsyncTask.java:230)05-28 20:34:21.073:E/XXX(904 ): java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 05-28 20:34:21.073:E/XXX(904):at java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:569) 05-28 20:34:21.073:E/XXX(904):在 java.lang.Thread.run(Thread.java:856)05-28 20:34:21.073:E/XXX(904): 引起:JAVA .util.ConcurrentModificationException 05-28 20:34:21.073:E/XXX(904):在 的java.util.ArrayList $ ArrayListIterator.next(ArrayList.java:569)
请加异常的消息,那就是“为(人民peopleList:记录)”中的代码回路你的问题 – mschenk74
@ mschenk74:在我收到第二种情况下,exeception是环路for(People peopleList:records) – theJava
当你有一个迭代器的时候,你已经掌握了修改对象的权利。 –