Javadoc的大部分内容.将突出显示解释您所看到的行为的相关部分.
Note that this implementation is not synchronized. If multiple threads
access an ArrayList instance concurrently,and at least one of the
threads modifies the list structurally,it must be synchronized
externally. (A structural modification is any operation that adds or
deletes one or more elements,or explicitly resizes the backing array;
merely setting the value of an element is not a structural
modification.) This is typically accomplished by synchronizing on some
object that naturally encapsulates the list. If no such object exists,
the list should be “wrapped” using the Collections.synchronizedList
method. This is best done at creation time,to prevent accidental
unsynchronized access to the list:
List list = Collections.synchronizedList(new ArrayList(…));
The iterators returned by this class’s iterator and listIterator methods
are fail-fast: if the list is structurally modified at any time after
the iterator is created,in any way except through the iterator’s own
remove or add methods,the iterator will throw a
ConcurrentModificationException. Thus,in the face of concurrent
modification,the iterator fails quickly and cleanly,rather than
risking arbitrary,non-deterministic behavior at an undetermined time
in the future.
Note that the fail-fast behavior of an iterator cannot be guaranteed
as it is,generally speaking,impossible to make any hard guarantees
in the presence of unsynchronized concurrent modification. Fail-fast
iterators throw ConcurrentModificationException on a best-effort
basis. Therefore,it would be wrong to write a program that depended
on this exception for its correctness: the fail-fast behavior of
iterators should be used only to detect bugs.
如果在通过迭代器访问列表时从结构上修改列表,ArrayLists通常会抛出并发修改异常(但即使这不是绝对的保证).请注意,在您的示例中,您将直接从列表中删除元素,并且您没有使用迭代器.