2016-07-25 82 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'变量的访问。 –