Add*_*dev 1 java multithreading android thread-safety
我有个问题。同时访问一个Vector,我得到一个ConcurrentModificationException。我在所有向量迭代中添加了同步块,但也许忘记了一个,或者还有另一个泄漏。
问题是在错误堆栈跟踪中显示的错误是对Vector.retainAll()的调用,这是一个同步方法。我如何猜测碰撞中涉及的其他点呢?
提前致谢
08-24 13:37:25.968: ERROR/AndroidRuntime(6582): java.util.ConcurrentModificationException
08-24 13:37:25.968: ERROR/AndroidRuntime(6582): at java.util.AbstractList$SubAbstractList.listIterator(AbstractList.java:320)
08-24 13:37:25.968: ERROR/AndroidRuntime(6582): at java.util.AbstractList$SubAbstractList.iterator(AbstractList.java:307)
08-24 13:37:25.968: ERROR/AndroidRuntime(6582): at java.util.AbstractCollection.contains(AbstractCollection.java:128)
08-24 13:37:25.968: ERROR/AndroidRuntime(6582): at java.util.Collections$SynchronizedCollection.contains(Collections.java:432)
08-24 13:37:25.968: ERROR/AndroidRuntime(6582): at java.util.AbstractCollection.retainAll(AbstractCollection.java:319)
08-24 13:37:25.968: ERROR/AndroidRuntime(6582): at java.util.Vector.retainAll(Vector.java:856)
Run Code Online (Sandbox Code Playgroud)
检查在迭代时在结构上修改 Vector(添加或删除)的代码-这很可能是获得CME的原因。使用迭代器进行此类修改以避免CME
void unsafeMod(Vector data) {
for (Object o : data) {
if (o != null) {
data.remove(o); // may cause CME
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还建议使用ArrayList而不是Vector。
| 归档时间: |
|
| 查看次数: |
1318 次 |
| 最近记录: |