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?
Trả lời
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.
- Đọc không chặn và chỉ thanh toán hiệu quả chi phí đọc dễ bay hơi.
- 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.
- 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
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
Để đọ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
[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
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.
- 1. Sao chép hoặc sao chép bộ sưu tập trong Julia
- 2. Sao chép tập tin an toàn trên NAS Filer
- 3. Ghi nhật ký an toàn đa luồng
- 4. Java: sao chép Bộ sưu tập tùy ý thông qua tham chiếu đến Bộ sưu tập
- 5. Bộ sưu tập an toàn Null dưới dạng luồng trong Java 8
- 6. Bộ sưu tập không an toàn chứa phương pháp
- 7. Thư viện .NET nào có bộ sưu tập sao chép-ghi-ghi?
- 8. Bộ sưu tập an toàn chủ đề trong .NET
- 9. An toàn loại tốt hơn trong bộ sưu tập Java
- 10. Các hoạt động LINQ trên chuỗi bộ sưu tập đồng thời có an toàn không?
- 11. Tại sao đọc không an toàn cho luồng?
- 12. Tại sao bộ sưu tập Java không cung cấp phương thức bản đồ thuận tiện?
- 13. Sao chép một bộ sưu tập trong MongoDB
- 14. Cung cấp các trang Django an toàn với HTTPS
- 15. Luồng có an toàn không?
- 16. Làm cách nào để tạo Trình cung cấp nội dung an toàn cho chủ đề?
- 17. CDN an toàn để cung cấp jQuery như thế nào?
- 18. Cách an toàn, kiểu an toàn để làm phẳng các bộ sưu tập tùy ý lồng nhau trong Scala?
- 19. MongoDB 3.0 ghi khóa trên bộ sưu tập oplog ở chế độ bản sao
- 20. Biến an toàn cho toàn bộ playbook có thể là
- 21. Kết hợp luồng Bộ sưu tập vào một Bộ sưu tập - Java 8
- 22. Chỉ các bộ sưu tập chỉ ghi trong MongoDB
- 23. Cấp phép Laravel cho bộ sưu tập Eloquent
- 24. Ghi nhật ký an toàn
- 25. Dòng Java 8 vs Bộ sưu tập Bộ sưu tập
- 26. Cách đơn giản nhất để tạo toàn bộ một phương thức an toàn cho luồng?
- 27. Tại sao iterating trên GetConsumingEnumerable() không hoàn toàn trống nằm bên dưới bộ sưu tập chặn
- 28. sao chép luồng qua byte []
- 29. Có C# Parallel.ForEach sử dụng cùng một luồng cho các lần lặp của bộ sưu tập
- 30. HashSet an toàn theo chủ đề với Bộ sưu tập tiếng tăm
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
http://javamex.com/tutorials/synchronization_concurrency_8_copy_on_write.shtml – Thilo