Khi bạn sử dụng Collections.synchronizedList(new ArrayList<>())
bạn đang tách hai chi tiết triển khai. Rõ ràng, cách bạn có thể thay đổi mô hình lưu trữ cơ bản từ “dựa trên mảng” thành, ví dụ: “Các nút được liên kết”, chỉ cần thay thế new ArrayList
bằng new LinkedList
mà không thay đổi trang trí synchronized
.
Tuyên bố rằng Vector
"sẽ nhanh hơn một chút" dường như dựa trên thực tế là việc sử dụng nó không mang một phái đoàn giữa trình bao bọc và bộ nhớ cơ bản, nhưng phát sinh các tuyên bố về hiệu suất từ đó thậm chí còn có vấn đề bởi thời gian, khi ArrayList
và trình bao bọc synchronizedList
được giới thiệu. Cần lưu ý rằng khi bạn thực sự lo ngại về hiệu suất của danh sách được truy cập bởi nhiều chủ đề, bạn sẽ sử dụng không của hai lựa chọn thay thế này. Ý tưởng tạo một chuỗi lưu trữ an toàn bằng cách thực hiện tất cả các phương thức truy cập synchronized
là thiếu sót ngay từ đầu. Mọi hoạt động liên quan đến nhiều quyền truy cập vào danh sách, ví dụ: cấu trúc đơn giản như if(!list.contains(o)) list.add(o);
hoặc lặp qua danh sách hoặc thậm chí là Collections.swap(list, i, j);
đơn giản yêu cầu đồng bộ hóa thủ công bổ sung để hoạt động chính xác trong cài đặt đa luồng. Nếu bạn nghĩ rằng nó kết thúc, bạn sẽ nhận ra rằng hầu hết các hoạt động của một ứng dụng thực tế đời sống bao gồm nhiều truy cập và do đó sẽ yêu cầu khóa thủ công cẩn thận và thực tế là mọi phương pháp truy cập cấp thấp đồng bộ bổ sung có thể không chỉ lấy đi hiệu suất, nó cũng là một ngụy trang giả vờ một sự an toàn mà không có ở đó.
Sự khác biệt hiệu suất, nếu có và nếu nó vẫn tồn tại kể từ thời điểm bài viết được viết, có lẽ không đáng kể. Vector nên được coi là không được chấp nhận. Làm như thể nó không tồn tại. Hơn nữa, Collections.synchronizedList() thể hiện ý định rõ ràng: nó nói với người đọc: Tôi cần một danh sách đồng bộ ở đây. Trong khi Vector mới nói với người đọc: điều này phải được viết cách đây nhiều năm, hoặc bởi một lập trình viên đã học Java 17 năm trước và không bao giờ được cập nhật. –
@JBNizet Có ví dụ nào cho thấy Vector không phù hợp để đồng bộ hóa và SynchronizedList đang thực hiện công việc tốt hơn nó không, bởi vì khi tôi nhìn vào bên trong mã của chúng, cả hai đều sử dụng các khối/phương thức đồng bộ. –
Nó không phải là một trong những đồng bộ và khác là không. Tôi không nói thế. Đó là Vector trước ngày API Bộ sưu tập, mang lại rất nhiều phương thức đã lỗi thời và được thay thế bằng ArrayList và Collections.synchronizedList (arrayList).Nếu nó không được chính thức không được chấp nhận, có lẽ vì nó vẫn được sử dụng trong các API công cộng của các lớp cũ khác của JDK. Nhưng bạn nên xem xét nó như vậy. –