2016-01-01 21 views
7

Trong khi đọc Oracle hướng dẫn về bộ sưu tập triển khai, tôi tìm thấy những câu sau:Vector vs hiệu suất SynchronizedList

Nếu bạn cần đồng bộ, một Vector sẽ nhanh hơn một chút so với một ArrayList đồng bộ với Collections.synchronizedList

source: List Implementations

nhưng khi tìm kiếm sự khác biệt giữa chúng, nhiều người không khuyến khích sử dụng Vector và phải được thay thế bằng SynchronizedList khi cần đồng bộ hóa. Vậy bên nào có quyền được theo dõi?

+5

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. –

+0

@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ộ. –

+2

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. –

Trả lời

0

Vector là một API cũ, tất nhiên. Không có câu hỏi ở đó.

Vì tốc độ, có thể chỉ vì danh sách được đồng bộ liên quan đến các cuộc gọi phương thức bổ sung để tiếp cận và trả về dữ liệu vì nó là "trình bao bọc" ở đầu danh sách. Đó là tất cả để có nó, imho.

0

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ó ở đó.