2016-07-25 33 views
0

我有下面的代碼片段代碼。我有2個線程A和B同時運行。循環中是否存在ConcurrentModificationException異常

List<String> listPeople = new ArrayList<>(); 
// Add more item 
..... 

Thread A 
for (String item : listPeople) { 
    System.out.println("Name is: " + item.name); 
} 

Thread B 
- add/remove item to list people 

使用這種for循環形式,它通過List的iterator循環。那麼它會崩潰與ConcurrentModificationException

+0

正如@Daniel Pryden在他的回答中解釋的那樣,你不能指望它。有時它可能會拋出ConcurrentModificationException,而有時它可能不會。 –

+0

謝謝你回答。爲了安全起見,我應該使用for(;;)語句,對吧? –

回答

4

ConcurrentModificationException Javadoc

請注意,此異常不會始終指出對象已經由不同線程併發修改。 [...]

請注意,無法保證故障快速行爲,因爲一般來說,不可能在存在未同步的併發修改時做出任何硬性保證。盡力而爲快速失敗操作會拋出ConcurrentModificationException。因此,編寫一個依賴於此例外的程序是正確的:ConcurrentModificationException應僅用於檢測錯誤。

+0

謝謝你的回答。爲了安全起見,我應該使用for(;;)語句,對吧? –

+0

@HuyDuongTu:不,爲了安全起見,您應該避免在線程之間共享集合,或者使用線程安全的實現。例如,您可以使用相同的監視器鎖同步所有對'ArrayList'變量的訪問。 –