当多个线程并发修改可变集合时会发生 ConcurrentModificationException,通常会违反其内部一致性。为了说明这个概念,让我们分析遇到此异常的代码片段。
import java.util.*; public class ConcurrentModificationExample { public static void main(String[] args) { List<String> s = new ArrayList<>(); ListIterator<String> it = s.listIterator(); for (String a : args) s.add(a); if (it.hasNext()) String item = it.next(); System.out.println(s); } }
此代码尝试在向列表添加元素时迭代列表。但是,由于 ListIterator 是在添加元素之前创建的,因此会引发异常。
为了避免此错误,我们可以修改代码如下:
import java.util.*; public class ConcurrentModificationExample { public static void main(String[] args) { List<String> s = new ArrayList<>(); for(String a : args) s.add(a); ListIterator<String> it = s.listIterator(); if(it.hasNext()) { String item = it.next(); } System.out.println(s); } }
在修改后的代码中,列表迭代器在元素添加到列表后创建,以确保一致性。 ListIterator 允许在迭代期间修改列表,但至关重要的是它是在列表初始化之后创建的,并且在创建和使用之间不能修改。这可确保列表在整个迭代过程中保持有效状态。
以上是迭代和修改 Java 列表时如何避免 ConcurrentModificationException?的详细内容。更多信息请关注PHP中文网其他相关文章!