ConcurrentModificationException修复问题

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)

gna*_*nat 5

检查在迭代时在结构上修改 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。