Java面試題#如何處理對集合的並發修改

2024年2月6日 17点热度 0人点赞

對 Java 中的集合進行並發修改可能會導致一系列問題,例如意外行為、不確定的結果,甚至拋出 ConcurrentModificationException。要處理 Java 中集合的並發修改,可以使用以下方法之一:

  • 使用同步集合:同步集合是一種線程安全的集合,可確保一次隻有一個線程可以修改該集合。我們可以通過調用Collections.synchronizedCollection()方法傳入要同步的集合來創建同步集合。

例如:

List<String> list = new ArrayList<>();
List<String> synchronizedList = Collections.synchronizedList(list);
  • 使用並發集合:處理集合並發修改的另一種方法是使用並發集合。並發集合是線程安全的集合,允許多個線程同時修改集合,而無需外部同步。( java.util.concurrent ) 包提供了一系列並發集合類,例如ConcurrentHashMap、ConcurrentLinkedDequeConcurrentSkipListSet
  • 使用顯式鎖定:我們還可以使用顯式鎖定來處理對集合的並發修改。我們可以在修改集合時使用synchronized關鍵字或者(java.util.concurrent.locks)包來鎖定集合。

例如:

List<String> list = new ArrayList<>();
synchronized(list) {
 list.add(“foo”);
}
  • 正確使用迭代器:迭代集合時,應使用 Iterator 接口以避免並發修改。在使用迭代器迭代集合時發生修改,將收到 ConcurrentModificationException。應使用迭代器的remove() 方法刪除元素。

例如:

List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
 String element = iterator.next();
 if (someCondition) {
 iterator.remove(); // safe way to remove an element from the list
 }
}