2013-03-10 29 views
2

我運行一個單獨的線程代碼(不是UI線程)ConcurrentModificationException的一個循環

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

它有時會導致ConcurrentModificationException的。 我知道,我不能添加或我是遍歷集合中刪除的對象,但在這個片段中,我不迭代上的菌株。我錯在哪裏?由於

回答

1

Synchronize您的訪問。這種凍結當前breeder對象,因此它不會在任何其他線程修改。試圖做到這一點的方法將被阻止。阻塞意味着它們只是等待(如System.sleep(X)),直到在其他線程中的​​塊已經被處理。

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

請確保您也把​​周圍的其他線程的訪問breeders

+1

這可能是問題。或者它可能是育種菌株的循環。但是,同步訪問不會改變任何東西,除非所有線程在每次訪問集合時都執行相同的操作。它應該被封裝在一個類中。 – 2013-03-10 16:07:34

+0

我試圖同步breedes存取權限,但沒有幫助..唯一的例外是在這裏燒「爲(種禽B:飼養者)」 – TheModularMind 2013-03-10 21:38:18