# Groovy 了解并发修改

**URL:** <https://www.isharkfly.com/t/groovy/6953>\
**Category:** 程序语言\
**Created:** [November 27, 2012, 5:11am UTC](https://www.isharkfly.com/t/groovy/6953 "2012-11-27T05:11:52Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [November 27, 2012, 5:11am UTC](https://www.isharkfly.com/t/groovy/6953/1 "2012-11-27T05:11:52Z")

</div>

如果你没有遇到这种限制，你应该看看ConcurrentModificationException，例如，不能通过迭代时（iterating）每次移除第一个元素的方式来从列表中移除所有的元素：`def list = [1, 2, 3, 4]
list.each{ list.remove(0) }
// throws ConcurrentModificationException !!`注意：在这里并发不是意味着另外一个线程从根本上改变集合，如例子中所显示的那样，甚至一个单线程的控制也能改变结构的稳定性。

在这个例子中，正确的解决方法是使用clear方法，Collections API有许多专门的方法，当选择方案时，考虑collect/addAll/removeAll/findAll/grep。

这导致第二个问题：一些方法工作在集合的一个副本上并且完成的时候返回这个副本， 而另外一些方法直接工作在调用的这个集合对象上（这个对象我们叫做接受者对象）。
