【发布时间】:2013-05-23 14:34:38
【问题描述】:
案例1:这不会导致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): at android.os.AsyncTask$3.done(AsyncTask.java:299) 05-28 20:34:21.073: E/XXX(904):在 java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 05-28 20:34:21.073: E/XXX(904): 在 java.util.concurrent.FutureTask.setException(FutureTask.java:124) 05-28 20:34:21.073: E/XXX(904): 在 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): 在 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)
【问题讨论】:
-
请将异常消息和“for (People peopleList: records)”循环内的代码添加到您的问题中
-
@mschenk74:我得到的第二种情况的异常是(People peopleList:records)的循环
-
当有一个迭代器在它上面时,你因为修改一个对象而受到了打击。
-
@HotLicks 但问题是为什么它不会在第一种情况下发生
-
在案例 1 中,您遍历 AsyncTask 本地的
people(至少参考是)。在情况 2 中,您迭代records,它将由您同时运行的尽可能多的 AsyncTask 共享。可能是这个原因吗?
标签: java