java - ConcurrentModificationException 修复问题

标签 java android multithreading thread-safety

我有一个问题。同时访问 Vector 我得到一个 ConcurrentModificationException。我将同步块(synchronized block)添加到所有 vector 迭代中,但可能忘记了一个或者还有另一个泄漏。

问题是错误堆栈跟踪显示的错误是对 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)

最佳答案

检查您在迭代 Vector 时结构性修改 Vector(添加或删除)的代码 - 这很可能是您得到 CME 的原因.使用迭代器做这样的修改,避免CME

void unsafeMod(Vector data) {
    for (Object o : data) {
        if (o != null) {
            data.remove(o); // may cause CME
        }
    }
}

我也支持 advice使用 ArrayList 而不是 Vector。

关于java - ConcurrentModificationException 修复问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7174844/

相关文章:

c# - 在 C# 线程中传递参数化方法时出错

java - 如果锁本身被争用会怎样?

java - 新手: Execution error

android - 如何以编程方式设置特定的宽度/高度以供查看?

java - 我不知道如何完成此代码以显示 Collection 夹列表

java - 为什么在模式对话框关闭之前不调用 done()?

java - 如何使deleteAction删除其他JPanel的JPanel中的按钮?

java - Spring-data-mongo 无法使用构造函数实例化 java.util.List

java - 使用 setScale() 方法舍入 BigDecimal : unexpected result

java - 我在 DAO 中为具体查询创建 AsynchTask 时遇到问题