CopyOnWriteArraySet
Đây là em trai của lớp
CopyOnWriteArrayList
. Đây là một tập hợp các lớp chuyên biệt được thêm vào trong JDK 1.5 cùng với các lớp họ hàng phổ biến hơn của chúng
ConcurrentHashMap
. Chúng là một phần
concurrent collection framework
và nằm trong gói
java.util.concurrent
.
CopyOnWriteArraySet
Phù hợp nhất cho các bộ sưu tập chỉ đọc có kích thước đủ nhỏ để sao chép nếu xảy ra một số thao tác sửa đổi. Ví dụ: bạn có thể sử dụng
CopyOnWriteArraySet
để lưu trữ một đối tượng khi ứng dụng khởi động và có nhiều luồng khác truy cập vào đối tượng đó trong suốt vòng đời của ứng dụng. Nếu một trạng thái hoặc đối tượng mới xuất hiện trong thời gian này, nó cũng có thể được thêm vào trạng thái hoặc đối tượng này
Set
, với chi phí tạo ra một mảng mới. Một trong những điều quan trọng nhất cần biết
CopyOnWriteArraySet
là nó được triển khai bằng
CopyOnWriteArrayList
. Điều này có nghĩa là nó
CopyOnWriteArraySet
cũng chia sẻ tất cả các thuộc tính cơ bản của
CopyOnWriteArrayList
. Một điều quan trọng khác cần nhớ là các trình vòng lặp của lớp bộ sưu tập này không hỗ trợ
remove()
. Việc cố gắng loại bỏ một phần tử trong quá trình tích hợp sẽ dẫn đến một giá trị ngoại lệ
UnsupportedOperationException
. Điều này được thực hiện để đảm bảo tốc độ trong quá trình bò. Việc thực hiện quá trình triển khai này
Set
bằng cách sử dụng trình vòng lặp khá nhanh và tránh được sự can thiệp từ các luồng khác. Để vận hành, các trình vòng lặp dựa vào ảnh chụp nhanh của mảng được chụp khi trình vòng lặp được tạo. Tóm lại, hãy sử dụng
CopyOnWriteArraySet
nếu
set
đủ nhỏ để sao chép khi thêm, thiết lập hoặc xóa đối tượng và mục đích chính là đọc dữ liệu cập nhật không thường xuyên. Ngoài ra, nếu bạn muốn loại bỏ các phần tử trong quá trình lặp, không sử dụng cách triển khai này vì trình vòng lặp của nó không hỗ trợ
remove()
và ném
java.lang.UnsupportedOperationException
, như hiển thị bên dưới:
[RAJ] Event received : FOUR
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.concurrent.CopyOnWriteArrayList$COWIterator.remove(Unknown Source)
at Publisher.notifySubs(HelloHP.java:43)
at HelloHP.main(HelloHP.java:23)
Ví dụ CopyOnWriteArraySet trong Java
Đây là một chương trình Java được tạo sẵn hướng dẫn cách sử dụng các tệp
CopyOnWriteArraySet
. Trong ví dụ của chúng tôi, chúng tôi đã sử dụng mẫu nhà xuất bản
-người đăng ký để minh họa cách sử dụng nó. Hầu hết người đăng ký đều đăng ký trong thời gian ra mắt ứng dụng và nhiệm vụ chính của nhà xuất bản là liệt kê họ và thông báo cho họ về bất kỳ bản cập nhật nào. Việc bổ sung và xóa người đăng ký có thể xảy ra tùy từng thời điểm. Vì chúng ta cần bỏ qua nhanh nên
CopyOnWriteArraySet
đây là một lựa chọn tốt, đặc biệt là trong môi trường đa luồng trong đó một luồng có thể thêm người đăng ký trong khi một luồng khác xử lý các bản cập nhật.
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArraySet;
public class CopyOnWriteArraySetDemo{
public static void main(String args[]) {
Publisher cricNext = new Publisher();
SubScriber raj = new SubScriber("RAJ");
SubScriber adom = new SubScriber("ADOM");
cricNext.addSubscriber(raj);
cricNext.addSubscriber(adom);
cricNext.notifySubs("FOUR");
cricNext.notifySubs("SIX");
}
}
class Publisher {
private CopyOnWriteArraySet setOfSubs = new CopyOnWriteArraySet();
public void addSubscriber(SubScriber sub) {
setOfSubs.add(sub);
}
public void notifySubs(String score) {
Iterator itr = setOfSubs.iterator();
while (itr.hasNext()) {
SubScriber sub = itr.next();
sub.receive(score);
}
}
}
class SubScriber {
private String _name;
public SubScriber(String name) {
this._name = name;
}
public void receive(String score) {
System.out.printf("[%s] Event received : %s %n", _name, score);
}
}
Đầu ra:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
Những gì cần nhớ
CopyOnWriteArraySet
triển khai
Collection
và các giao diện
Set
cũng như được thêm vào trong JDK 1.5, cùng với việc triển khai tùy chỉnh khác của
Set
'a,
EnumSet
. Nó cũng là
Set
một trong đó sử dụng nội bộ
CopyOnWriteArrayList
cho tất cả các hoạt động của nó. Vì vậy, nó chia sẻ các thuộc tính cơ bản giống nhau của lớp này. Vì không phải như vậy nên
SortedSet
thứ tự của các phần tử không được đảm bảo trong quá trình lặp.
-
CopyOnWriteArraySet
Phù hợp nhất cho các ứng dụng trong đó:
- Kích thước
Set
của 's có xu hướng vẫn nhỏ.
- Các thao tác
read-only
vượt trội hơn đáng kể so với các thao tác sửa đổi đối tượng.
- Bạn phải ngăn chặn sự can thiệp giữa các luồng trong quá trình truyền tải
Set
.
- Một ưu điểm khác
CopyOnWriteArraySet
là sự an toàn của luồng. Bộ sưu tập này hỗ trợ đồng thời.
- Các hoạt động đột biến (thêm, sửa đổi, xóa, v.v.) rất tốn kém vì chúng thường yêu cầu sao chép toàn bộ mảng cơ bản.
- Các trình vòng lặp không hỗ trợ thao tác xóa đột biến.
- Truyền tải bằng cách sử dụng iterator khá nhanh và trong quá trình đó, sự can thiệp của các luồng khác được loại trừ. Để vận hành, các trình vòng lặp dựa vào ảnh chụp nhanh của mảng được chụp khi trình vòng lặp được tạo.
Đó là tất cả về cách sử dụng
CopyOnWriteArraySet
trong Java. Như tôi đã nói, anh ấy là em trai
CopyOnWriteArrayList
. Vì vậy, nếu bạn hiểu ít nhất một trong số chúng, bạn có thể sử dụng cái còn lại. Sự khác biệt duy nhất là một cái là
List
'' và cái kia
Set
là '', vì vậy điều này đòi hỏi phải kế thừa tất cả những khác biệt giữa các cấu trúc dữ liệu này trong Java. Ví dụ:
List
thứ tự của các phần tử rất quan trọng và có thể chứa các bản sao. Mặc dù
Set
không có thứ tự nhưng nó không cho phép sao chép các đối tượng. Hãy luôn nhớ rằng
CopyOnWriteArraySet
đây là
Collection
lớp học chuyên biệt. Chỉ nên sử dụng khi điều kiện thuận lợi. Trong mọi trường hợp khác, bạn có thể sử dụng các triển khai có mục đích chung. Ví dụ:
HashSet
hoặc
LinkedHashSet
các lớp sưu tập được đồng bộ hóa. Bản gốc:
Cách sử dụng CopyOnWriteArraySet trong Java với ví dụ
GO TO FULL VERSION