Bảng so sánh
| Tiêu chí | ArrayList | CopyOnWriteArrayList |
| Đồng bộ hóa (thread-safe) | Không (non-synchronized) | Có (thread-safe – copy-on-write) |
| Hiệu năng ghi | Nhanh (không khóa) | Chậm (copy mảng mới mỗi lần ghi) |
| Hiệu năng đọc | Nhanh | Nhanh (đọc trên snapshot không khóa) |
| Iterator behavior | Fail-fast: ném ConcurrentModificationException nếu sửa đổi khi duyệt | Fail-safe: iterator hoạt động trên snapshot, không ném exception khi sửa đổi |
| Xóa khi duyệt (iterator.remove()) | Hỗ trợ | Không hỗ trợ – ném UnsupportedOperationException |
| Phiên bản Java ra mắt | Java 1.2 | Java 1.5 (java.util.concurrent) |
| Gói | java.util | java.util.concurrent |
Ví dụ ArrayList – iterator.remove() hợp lệ
import java.util.*;
public class ArrayListRemoveDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
String s = itr.next();
if (s.equals("B")) itr.remove(); // OK
}
System.out.println(list); // [A, C]
}
}
Ví dụ CopyOnWriteArrayList – iterator.remove() gây lỗi
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.*;
public class CowListRemoveDemo {
public static void main(String[] args) {
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(Arrays.asList("A", "B", "C"));
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
String s = itr.next();
System.out.println(s);
if (s.equals("B")) {
itr.remove(); // UnsupportedOperationException
}
}
}
}
Khi nào dùng CopyOnWriteArrayList?
- Môi trường đa luồng, đọc nhiều, ghi ít (read-heavy, write-rare).
- Cần duyệt an toàn mà không cần synchronized block.
- Không cần xóa phần tử trong lúc duyệt.