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); } }
此程式碼嘗試迭代使用 ListIterator 遍歷清單。但是,如果在使用迭代器 (it) 遍歷清單時向清單中新增元素 (s.add(a)),則可能會發生並發修改異常。
要解決此問題, Java 提供了快速失敗迭代器。每當迭代器嘗試存取集合時,它都會檢查集合的變更是否超出了迭代器的初始存取範圍。如果以任何超出迭代器存取點的方式修改集合,將會拋出 ConcurrentModificationException 例外。
避免並發修改異常的更新程式碼片段如下:
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); } }
請務必記住,ListIterator 無法識別創建迭代器之前發生的修改,只能識別使用迭代器時發生的修改。此外,迭代器不會阻止並發修改的發生,而是檢測並發修改並在發生時拋出異常。為了完全防止並發修改,應該採用同步機制。
以上是在 Java 中迭代集合時如何避免 ConcurrentModificationException?的詳細內容。更多資訊請關注PHP中文網其他相關文章!