2015-09-21 16 views
5

Làm thế nào để sao chép vào bộ sưu tập ghi cung cấp an toàn luồng và trong đó các tình huống nào chúng hữu ích để triển khai?Sao chép trên bộ sưu tập ghi cung cấp an toàn cho luồng?

+0

Lưu ý rằng sao chép trên ghi cũng có thể tránh ConcurrentModificationExceptions trong một chuỗi duy nhất. – Thilo

+1

http://javamex.com/tutorials/synchronization_concurrency_8_copy_on_write.shtml – Thilo

Trả lời

0

CopyOnWriteArrayList

Một thể hiện của CopyOnWriteArrayList cư xử như một thực hiện Danh sách cho phép nhiều đồng thời đọc và cho đọc để xảy ra đồng thời với một ghi. Cách thực hiện điều này là tạo một bản sao mới của danh sách mỗi khi nó được thay đổi.

  1. Đọc không chặn và chỉ thanh toán hiệu quả chi phí đọc dễ bay hơi.
  2. Ghi chú không chặn lần đọc (hoặc ngược lại), nhưng chỉ có thể viết một lần cùng một lúc.
  3. Không giống như ConcurrentHashMap, ghi các hoạt động viết hoặc truy cập nhiều yếu tố trong danh sách (chẳng hạn như addAll(), retainAll()) sẽ là nguyên tử.

Trong quá trình ghi, mảng phải được khóa hoàn toàn với các ghi khác. (Việc thực hiện tiêu chuẩn sử dụng ReentrantLock.) Tuy nhiên, điều này có nghĩa là như đã đề cập, các hoạt động ảnh hưởng đến nhiều vị trí có thể là nguyên tử. Tức là, nếu một chuỗi thêm một số mục vào danh sách với addAll() trong khi một chuỗi khác gọi kích thước(), chuỗi đọc kích thước sẽ nhận được giá trị phản ánh hoặc không phải số phần tử được thêm vào addAll(): đó sẽ không có khả năng của một giá trị trung gian trả lại (miễn là tất nhiên là hai luồng này chỉ truy cập vào danh sách!).

CopyOnWriteArrayList được thiết kế cho các trường hợp reads hugely outnumber writes.

CopyOnWriteArraySet

lớp Một, CopyOnWriteArraySet là xây dựng trên đầu trang của CopyOnWriteArrayList. Giống như đối tác danh sách của nó, nó được thiết kế cho các trường hợp tập hợp chỉ chứa một vài phần tử và nơi đọc lớn hơn nhiều so với viết.

tham khảo: Java copy-on-write collections

+0

Cơ chế khóa hoạt động như thế nào trong trường hợp này? Ví dụ Nếu một thread lặp qua danh sách, đọc các mục trong danh sách sau đó nó sẽ có được khóa trên đối tượng danh sách và trong quá trình mua lại của nó khóa như thế nào thread khác có thể đọc nó ?? Làm thế nào đến lần đọc không chặn ?? – prvn

+0

Để đọc nó không có khóa. Khóa chỉ được sử dụng khi bất kỳ cập nhật nào đang diễn ra trên mảng. – YoungHobbit

+0

[get()] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/CopyOnWriteArrayList.java#CopyOnWriteArrayList.get% 28% 29) phương pháp không có bất kỳ khóa nào khi [set()] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/CopyOnWriteArrayList.java#CopyOnWriteArrayList.set%28int%2Cjava.lang.Object%29) trước tiên lấy khóa rồi xử lý. – YoungHobbit

1

Cách nó thực hiện điều này là để tạo ra một thương hiệu bản sao mới của danh sách mỗi khi nó bị thay đổi.

Đọc không chặn và chỉ thanh toán hiệu quả chi phí đọc dễ bay hơi. Các ghi chú không chặn các lần đọc (hoặc ngược lại), nhưng chỉ một lần viết có thể xảy ra cùng một lúc.

Các vấn đề liên quan