【问题标题】:ConcurrentModificationException in a loop循环中的 ConcurrentModificationException
【发布时间】:2013-02-25 18:53:09
【问题描述】:

我在单独的线程(不是 UI 线程)上运行此代码

strains = new ArrayList<Strain>();
for (Breeder b : breeders) {
   for (Strain s : b.getStrains()) {
        strains.add(s);
    }
}

它有时会导致 ConcurrentModificationException。 我知道我无法从我正在迭代的 Collection 中添加或删除对象,但在这个 sn-p 中,我没有对菌株进行迭代。我哪里错了?谢谢

【问题讨论】:

    标签: java android collections iteration concurrentmodification


    【解决方案1】:

    Synchronize您的访问权限。这种冻结当前breeder对象,使其不会在任何其他线程中被修改。尝试执行此操作的方法将被阻止。阻塞意味着它们只是等待(如 System.sleep(x)),直到另一个线程中的 synchronized 块被处理。

    synchronized(breeders) {
        for (Breeder b : breeders) {
           for (Strain s : b.getStrains()) {
                strains.add(s);
            }
        }
    }
    

    确保您还将synchronized 放在其他线程对breeders 的访问权限周围。

    【讨论】:

    • 这可能是问题所在。或者它可能是育种菌株的循环。但是同步访问不会改变任何东西,除非所有线程每次访问集合时都做同样的事情。它应该被封装在一个类中。
    • 我尝试同步品种的访问权限,但没有帮助.. 此处触发异常“for (Breeder b : Breeders)”
    猜你喜欢
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 2012-04-06
    相关资源
    最近更新 更多