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

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


有时会导致ConcurrentModificationException。
我知道我无法从要迭代的Collection中添加或删除对象,但是在此代码段中,我没有迭代变量。我哪里错了?谢谢

最佳答案

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

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


确保在其他线程对synchronized的访问权限周围也加上breeders

07-26 03:15