2010-10-12 29 views
7

All,CopyOnWriteArray hoặc Vector

Cạnh Vector lớp có hơn ArrayList là nó được đồng bộ hóa và do đó đảm bảo thread-an toàn. Tuy nhiên, giữa CopyOnWriteArray và Vector, những gì nên được ưu tiên xem xét an toàn chủ đề và hiệu suất trong xem xét.

Trả lời

8

Nhìn chung, nó phụ thuộc vào tần suất và tính chất của hoạt động đọc và ghi và kích thước của mảng.

Bạn sẽ cần phải chuẩn trong ngữ cảnh của bạn để chắc chắn, nhưng đây là một số nguyên tắc chung:

  • Nếu bạn là chỉ sẽ đọc mảng, sau đó thậm chí ArrayList là chủ đề an toàn (do chỉ sửa đổi không an toàn chỉ là những thay đổi trong danh sách). Do đó, bạn sẽ muốn sử dụng cấu trúc dữ liệu không đồng bộ , hoặc ArrayList hoặc CopyOnWriteArrayList có thể là hoạt động tốt như nhau.
  • Nếu đọc là phổ biến hơn nhiều so với viết sau đó bạn sẽ có xu hướng thích CopyOnWriteArrayList, kể từ khi overhead mảng sao chép là chỉ phát sinh trên viết.
  • Nếu kích thước của Array là nhỏ, thì chi phí làm bản sao mảng cũng sẽ nhỏ, do đó điều này sẽ ủng hộ CopyOnWriteArrayList qua Vector.

Bạn cũng có thể muốn xem xét hai lựa chọn khác:

  • Sử dụng ArrayList nhưng đặt đồng bộ ở nơi khác để đảm bảo an toàn thread. Đây thực sự là phương pháp mà cá nhân tôi sử dụng thường xuyên nhất - về cơ bản ý tưởng là sử dụng khóa riêng biệt, cấp cao hơn để bảo vệ tất cả các cấu trúc dữ liệu có liên quan cùng một lúc. Điều này hiệu quả hơn nhiều so với việc đồng bộ hóa trên mọi thao tác đơn lẻ như Vector.
  • Hãy xem xét một bất biến persistent data structure - chúng được đảm bảo là luồng an toàn do bất biến, không yêu cầu đồng bộ hóa và cũng được hưởng lợi từ chi phí thấp (tức là chúng chia sẻ hầu hết dữ liệu giữa các trường hợp khác nhau hơn là tạo bản sao hoàn chỉnh mới). Các ngôn ngữ như Clojure sử dụng các ngôn ngữ này để có được hiệu suất giống như ArrayList đồng thời đảm bảo an toàn toàn bộ chuỗi.
+0

Ngoài ra, hãy xem xét sử dụng Collections.synchronizedList để bọc Danh sách không an toàn, thay vì thực hiện đồng bộ hóa bên ngoài – barjak

+0

"sử dụng khóa riêng biệt, cao hơn ... ** hiệu quả hơn ** có đồng bộ hóa trên mọi hoạt động đơn lẻ "-> Thuận tiện có thể, nhưng hiệu quả? Tôi nghĩ rằng một khóa cấp cao hơn là hoàn toàn trái ngược với hiệu quả. – Kashyap

+0

"sử dụng khóa riêng biệt, cấp cao hơn ... Điều này hiệu quả hơn ** ** so với việc đồng bộ hóa trên mọi thao tác đơn lẻ" -> Thuận tiện có thể, nhưng hiệu quả? Tôi nghĩ rằng một khóa cấp cao hơn là hoàn toàn trái ngược với hiệu quả. – Kashyap

7

Tùy thuộc vào mẫu sử dụng - nếu bạn có nhiều lần đọc hơn viết, hãy sử dụng CopyOnWriteArrayList, nếu không hãy sử dụng Vector.

Vector giới thiệu độ trễ đồng bộ hóa nhỏ cho mỗi thao tác, khi CopyOnWriteArrayList có thời gian chờ ghi lâu hơn (do sao chép) nhưng không bị trì hoãn cho lần đọc.

Một xem xét khác là hành vi của trình lặp - Vector yêu cầu đồng bộ hóa rõ ràng khi bạn đang lặp lại nó (vì vậy không thể thực hiện thao tác ghi cùng một lúc), CopyOnWriteArrayList thì không.