Java 中的并发修改异常
当多个线程尝试修改共享数据结构(例如列出,同时。这可能会导致意外结果和数据损坏。
考虑以下 Java 代码:
import java.util.*; public class SomeClass { 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); } }
此代码尝试迭代列表,同时修改它。运行时抛出“并发修改异常”。这是因为列表迭代器是在对列表进行任何更改之前创建的。
为了避免此异常,您应该确保一次只有一个线程可以修改列表。您可以通过仅在对列表进行所有修改后创建迭代器来完成此操作。正确的代码是:
import java.util.*; public class SomeClass { 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); } }
通过在列表修改后创建迭代器,可以确保在迭代期间只有一个线程可以访问列表。这可以防止“并发修改异常”的发生。
以上是迭代和修改Java列表时如何避免并发修改异常?的详细内容。更多信息请关注PHP中文网其他相关文章!