情况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
问题的。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):在Java
.util.concurrent.FutureTask $
Sync.innerSetException(FutureTask.java:273)05-28 20:34:21.073:E /
XXX(904):at
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):at java.util.concurrent.ThreadPoolExecutor $
Worker.run(ThreadPoolExecutor.java:569)05-28 20: 34:21.073:E / XXX(904):at
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):at java.util.ArrayList $
ArrayListIterator.next(ArrayList.java:569)ArrayList $
ArrayListIterator.next(ArrayList.java:569)ArrayList $
ArrayListIterator.next(ArrayList.java:569)
一般来说ConcurrentModificationException
,如果您尝试在迭代集合时修改集合,则会引发a。例如:
public class Main {
public static void main(String[] args)
throws Exception {
final List<Object> c1 = new ArrayList<Object>(Arrays.<Object>asList(1, 2, 3));
for (Object o: c1) c1.remove(o);
}
}
会java.util.ConcurrentModificationException
在运行时导致运行,因为我们在迭代列表时正在修改列表(注意:此处仅涉及单个线程)。列表的迭代器检测到此情况,并导致异常。
如果所需修改是从迭代器刚收到非常元素的缺失,就可以达到预期的效果(在单线程情况下!)通过与工作直接迭代。将for
(每个)循环替换为:
final Iterator<Object> iterator = c1.iterator();
while (iterator.hasNext()) {
final Object o = iterator.next();
if (satisfiesSomeCriterion(o)) iterator.remove();
}
但是,这并不适用于所有修改。例如,添加将不起作用。以下代码仍然失败:
for (Object o: c1) c1.add(Integer.valueOf(((Integer)o).intValue() + 10));
如果基础集合是List
,则可以使用a ListIterator
代替普通的迭代器来解决此限制:
final ListIterator<Integer> iterator = c1.listIterator();
while (iterator.hasNext()) {
final Integer o = iterator.next();
if (satisfiesSomeCriterion(o)) iterator.add(Integer.valueOf(o.intValue() + 10);
}
但是请注意,这与上面给出的代码(插入元素的其他位置)不同。还要注意,这ListIterator.add
是一个可选方法;一个实现可能UnsupportedOperationException
在调用时抛出一个。
上述所有内容仅适用于单线程情况。如果您尝试在没有适当同步的情况下从多个线程同时访问同一集合,则会出现一系列新问题,因为这不仅可能导致ConcurrentModificationException
迭代线程中出现s,而且可能破坏集合内部数据的完整性。结构。
您可以做几件事:
CopyOnWriteArrayList
您已经提到的集合)Collections.synchronizedList
(...Set
,...Whatever
)包装集合。但是请注意,在这种情况下,您仍然有责任针对迭代提供适当的锁定规则。有关详细信息,请参见此答案。synchronized
块保护集合的所有使用(例如,将集合本身用作“监视”对象,尽管更好:使用专用的监视对象)。从Web API 2的模板中,post方法总是这样的: 我不理解这个< code>CreatedAtRoute()方法。有人能给我解释一下吗?
问题内容: 我不太了解Java中“ this”的用法。如果有人可以帮助我澄清一下,我将不胜感激。 在此网站上显示:http : //docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html “在实例方法或构造函数中,这是对当前对象的引用,该对象是正在调用其方法或构造函数的对象。使用此方法,您可以从实例方法或构造函数中引用当前对象的任何成员。
问题内容: 有人可以在hibernate状态下向我解释吗?我很难理解它。 如果可以举一个例子来解释它,那就最棒了,并且它在哪种用例中最适用? 问题答案: 这是Object DB的一个很好的解释。 指定ManyToOne或OneToOne关系属性,该属性提供EmbeddedId主键,EmbeddedId主键内的属性或父实体的简单主键的映射。value元素指定关系属性所对应的组合键中的属性。如果实体的
本文向大家介绍有人可以向我解释JavaScript变量之前的加号吗?,包括了有人可以向我解释JavaScript变量之前的加号吗?的使用技巧和注意事项,需要的朋友参考一下 变量之前的加号(+)定义您要使用的变量是数字变量。 在下面的代码中,有关于加号的简短描述。以下是代码- 示例 要运行上述程序,您需要使用以下命令- 输出结果 在这里,我的文件名为demo149.js。这将产生以下输出-
我从一位同事的代码中读到了这几行: 我认为这将为Bean classA和classB创建2个数据源。为了注入数据源,我们需要如下内容: 但是Spring只创建了一个数据源,this.mysqlDataSource()每次都返回相同的数据源。它是怎么发生的?如果我确实需要另一个数据源,我需要立即创建它?
问题内容: 当我将字符串值1和7存储到“ mykey”中时, redis中到底存储了 什么?以及getbit在redis中如何工作? 有人试图在该值内循环位吗? 我知道bitcount会给我2,但我也想从中获得确切的字符串值1和7,这可能吗? -- 我通过使用erlang redis客户端读取输出进行了一些实验。 erlang输出: 然后删除此条目: 我做同样的事情来偏移2 4 8,在这里您可以看