2

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

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

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

4

1 回答 1

1

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

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

确保您还设置synchronized了其他线程对breeders.

于 2013-03-10T16:04:58.803 回答