JavaRush /Blog Java /Random-VI /Cách sử dụng CopyOnWriteArraySet trong Java với ví dụ (bả...
Lam-lam
Mức độ

Cách sử dụng CopyOnWriteArraySet trong Java với ví dụ (bản dịch)

Xuất bản trong nhóm
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 frameworkvà nằm trong gói java.util.concurrent. Ví dụ về cách sử dụng CopyOnWriteArraySet trong Java (bản dịch) - 1CopyOnWriteArraySetPhù 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 CopyOnWriteArraySetlà nó được triển khai bằng CopyOnWriteArrayList. Điều này có nghĩa là nó CopyOnWriteArraySetcũ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 Setbằ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 CopyOnWriteArraySetnế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;

/**
 * Java program to demonstrate how to use CopyOnWriteArraySet in Java. Remember,
 * CopyOnWriteArraySet doesn't support remove() operation.
 *
 * @author Javin Paul
 */
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);

            //itr.remove(); // not allowed, throws UnsupportedOperationException
        }
    }
}

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ớ

CopyOnWriteArraySettriển khai Collectionvà các giao diện Setcũ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à Setmột trong đó sử dụng nội bộ CopyOnWriteArrayListcho 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 SortedSetthứ tự của các phần tử không được đảm bảo trong quá trình lặp. Ví dụ về cách sử dụng CopyOnWriteArraySet trong Java (bản dịch) - 2
  1. CopyOnWriteArraySetPhù hợp nhất cho các ứng dụng trong đó:

    • Kích thước Setcủa 's có xu hướng vẫn nhỏ.
    • Các thao tác read-onlyvượ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.
  2. Một ưu điểm khác CopyOnWriteArraySetlà sự an toàn của luồng. Bộ sưu tập này hỗ trợ đồng thời.
  3. 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.
  4. Các trình vòng lặp không hỗ trợ thao tác xóa đột biến.
  5. 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 CopyOnWriteArraySettrong 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 Setlà '', 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ụ: Listthứ 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ù Setkhô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à Collectionlớ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ụ: HashSethoặc LinkedHashSetcá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ụ
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION