假设有一个实现了 `Iterable` 接口的自定义类 `MyCollection`,其中内部使用一个 `ArrayList` 存储数据。在多线程环境下,多个线程同时使用 `MyCollection` 的 `iterator()` 方法获取 `Iterator` 对象并进行遍历,以下关于如何安全地进行遍历的说法正确的是:
答案解析
选项 A 错误,即使每个线程使用各自的迭代器对象,如果多个线程同时修改底层 `ArrayList` (通过 `MyCollection` 对象方法修改),仍然会触发 `ConcurrentModificationException`。选项 B 错误,使用 `synchronized` 关键字限制 `iterator()` 方法,只能保证每次只有一个线程获取到 `Iterator` 对象,不能保证返回的 `Iterator` 对象在被其他线程操作的同时不被其他线程修改。选项 C 错误,即使锁定 `Iterator` 对象的操作,也无法保证在遍历过程中不会有线程通过 `MyCollection` 修改底层的 `ArrayList`,导致迭代器状态失效。选项 D 才是正确的,由于 `ArrayList` 本身不是线程安全的,即使各自使用迭代器对象,如果存在并发修改 `ArrayList` 的操作,依然会导致 `ConcurrentModificationException`。使用锁控制对底层数据结构的访问,才能从根本上解决线程安全问题,但是题目中没有锁,故D正确。
正确答案:D