我正在使用JPA持久化对象.Main对象与另一个对象具有一个拥有的One-Many关系.另一个对象存储在HashMap中.什么样的同步可以解决这个问题?它似乎发生在完全随机的时间,并且非常难以预测.这是我得到的例外:
Exception in thread "pool-1-thread-1" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
at java.util.HashMap$ValueIterator.next(Unknown Source)
at org.hibernate.collection.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:555)
at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
Run Code Online (Sandbox Code Playgroud) 问题发生在
Element element = it.next();
Run Code Online (Sandbox Code Playgroud)
并且包含该行的代码位于 OnTouchEvent
for (Iterator<Element> it = mElements.iterator(); it.hasNext();){
Element element = it.next();
if(touchX > element.mX && touchX < element.mX + element.mBitmap.getWidth() && touchY > element.mY
&& touchY < element.mY + element.mBitmap.getHeight()) {
//irrelevant stuff..
if(element.cFlag){
mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY));
element.cFlag = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
所有这一切都在里面synchronized(mElements),这里mElements是一个ArrayList<Element>
当我触摸它时Element,它可能会激活cFlag,这将创建另一个Element具有不同属性的属性,这些属性将从屏幕上掉落并在不到一秒的时间内自行消失.这是我创建粒子效果的方式.我们可以称之为"粒子" crack,就像构造函数中的String参数一样.
这一切都正常,直到我添加另一个主要Element.现在我同时Elements在屏幕上有两个,如果我触摸最新的Element,它工作正常,并启动粒子.
但是,如果我触摸并激活cFlag旧版本Element,那么它会给我一个例外.
07-28 15:36:59.815: ERROR/AndroidRuntime(4026): FATAL …Run Code Online (Sandbox Code Playgroud) 我有非常简单的代码:
List<String> list = new ArrayList<String>();
String a = "a";
String b = "b";
String c = "c";
String d = "d";
list.add(a);
list.add(b);
list.add(c);
List<String> backedList = list.subList(0, 2);
list.add(0, d);
System.out.println("2b: " + backedList);
Run Code Online (Sandbox Code Playgroud)
我通过list.add(0,d)得到ConcurrentModificationException异常.所以一般来说,这是因为sublist().我很困惑,因为在sublist()的情况下,文档说:
返回的列表由此列表支持,因此返回列表中的非结构更改将反映在此列表中,反之亦然.
你能解释一下捕获的位置吗?