JavaRush /จาวาบล็อก /Random-TH /วิธีใช้ CopyOnWriteArraySet ใน Java พร้อมตัวอย่าง (การแปล...
Lam-lam
ระดับ

วิธีใช้ CopyOnWriteArraySet ใน Java พร้อมตัวอย่าง (การแปล)

เผยแพร่ในกลุ่ม
CopyOnWriteArraySetCopyOnWriteArrayListนี่คือน้องชายของชั้น เหล่านี้เป็นชุดคลาสพิเศษที่เพิ่มเข้ามาใน JDK 1.5 พร้อมด้วยลูกพี่ลูกน้องที่ได้รับความนิยมConcurrentHashMapมากกว่า เป็นส่วนหนึ่งconcurrent collection frameworkและอยู่ในบรรจุjava.util.concurrentภัณฑ์ วิธีใช้ CopyOnWriteArraySet ใน Java พร้อมตัวอย่าง (การแปล) - 1CopyOnWriteArraySetเหมาะที่สุดสำหรับคอลเลกชันแบบอ่านอย่างเดียวที่มีขนาดเล็กพอที่จะคัดลอกได้ หากมีการดำเนินการแก้ไขบางอย่างเกิดขึ้น ตัวอย่างเช่น คุณสามารถใช้CopyOnWriteArraySetเพื่อจัดเก็บออบเจ็กต์เมื่อแอปพลิเคชันเริ่มทำงาน และให้เธรดอื่นๆ หลายเธรดเข้าถึงออบเจ็กต์นั้นตลอดวงจรชีวิตของแอปพลิเคชัน หากมีสถานะหรือออบเจ็กต์ใหม่เข้ามาในช่วงเวลานี้ ก็อาจถูกเพิ่มเข้าไปในสถานะหรือออบเจ็กต์นี้ด้วยSetโดยต้องเสียค่าใช้จ่ายในการสร้างอาร์เรย์ใหม่ สิ่งสำคัญที่สุดประการหนึ่งที่ต้องรู้CopyOnWriteArraySetคือมีการใช้งานโดยใช้CopyOnWriteArrayList. ซึ่งหมายความว่ามันCopyOnWriteArraySetยังใช้คุณสมบัติพื้นฐานทั้งหมดของCopyOnWriteArrayList. สิ่งสำคัญอีกประการหนึ่งที่ต้องจำก็คือตัววนซ้ำของคลาสคอลเลกชันนี้ไม่รองรับไฟล์remove(). การพยายามลบองค์ประกอบระหว่างการรวมจะส่งผลให้เกิดค่าผิดUnsupportedOperationExceptionปกติ ทำเช่นนี้เพื่อให้แน่ใจว่ามีความเร็วระหว่างการรวบรวมข้อมูล การข้ามการใช้งานนี้Setโดยใช้ตัววนซ้ำนั้นค่อนข้างรวดเร็วและหลีกเลี่ยงการรบกวนจากเธรดอื่น ในการทำงาน ตัววนซ้ำอาศัยสแน็ปช็อตของอาร์เรย์ที่ถ่ายเมื่อสร้างตัววนซ้ำ กล่าวโดยสรุป ให้ใช้CopyOnWriteArraySetหากsetมีขนาดเล็กพอที่จะคัดลอกเมื่อเพิ่ม ตั้งค่า หรือลบออบเจ็กต์ และจุดประสงค์หลักคือเพื่ออ่านข้อมูลที่อัปเดตเป็นระยะ นอกจากนี้ หากคุณต้องการลบองค์ประกอบระหว่างการวนซ้ำ อย่าใช้การดำเนินการนี้เนื่องจากตัววนซ้ำไม่รองรับremove()และพ่นjava.lang.UnsupportedOperationExceptionดังที่แสดงด้านล่าง:
[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)

ตัวอย่าง CopyOnWriteArraySet ใน Java

นี่คือโปรแกรม Java สำเร็จรูปที่แสดงวิธีการใช้งานCopyOnWriteArraySet. ในตัวอย่างของเรา เราใช้รูปแบบผู้เผยแพร่-subscriberเพื่อสาธิตการใช้งาน สมาชิกส่วนใหญ่สมัครรับข้อมูลในระหว่างการเปิดตัวแอปพลิเคชันและงานหลักของผู้จัดพิมพ์คือการแจกแจงและแจ้งให้พวกเขาทราบถึงการอัปเดตใด ๆ การเพิ่มและการลบสมาชิกอาจเกิดขึ้นเป็นครั้งคราว เนื่องจากเราต้องการการบายพาสที่รวดเร็วCopyOnWriteArraySetนี่จึงเป็นตัวเลือกที่ดี โดยเฉพาะอย่างยิ่งในสภาพแวดล้อมแบบมัลติเธรด โดยที่เธรดหนึ่งสามารถเพิ่มสมาชิกได้ ในขณะที่อีกเธรดหนึ่งจัดการการอัปเดต
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);
    }
}
เอาท์พุท:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX

สิ่งที่ต้องจำ

CopyOnWriteArraySetใช้งานCollectionand interfaces Setเช่นเดียวกับที่เพิ่มใน JDK 1.5 พร้อมกับการใช้งานที่กำหนดเองอื่นของSet'a, EnumSet. นอกจากนี้ยังเป็นSetสิ่งหนึ่งที่ใช้ภายในCopyOnWriteArrayListสำหรับการดำเนินการทั้งหมด ดังนั้นจึงมีคุณสมบัติพื้นฐานเดียวกันของคลาสนี้ เนื่องจากไม่ใช่ จึงSortedSetไม่รับประกันลำดับขององค์ประกอบในระหว่างการวนซ้ำ วิธีใช้ CopyOnWriteArraySet ใน Java พร้อมตัวอย่าง (การแปล) - 2
  1. CopyOnWriteArraySetเหมาะที่สุดสำหรับการใช้งานโดยที่:

    • ขนาดSetของ ' มักจะยังเล็กอยู่
    • การดำเนินงานread-onlyมีความเหนือกว่าการดำเนินงานที่ปรับเปลี่ยนวัตถุอย่างมาก
    • คุณต้องป้องกันการรบกวนระหว่างเธรดระหว่างการข้ามSetผ่าน
  2. ข้อดีอีกประการหนึ่งCopyOnWriteArraySetคือความปลอดภัยของด้าย คอลเลกชันนี้รองรับการทำงานพร้อมกัน
  3. การดำเนินการกลายพันธุ์ (การเพิ่ม การแก้ไข การลบ ฯลฯ) มีราคาแพง เนื่องจากโดยปกติแล้วจะต้องคัดลอกอาร์เรย์พื้นฐานทั้งหมด
  4. ตัววนซ้ำไม่สนับสนุนการดำเนินการลบแบบกลายพันธุ์
  5. การข้ามผ่านโดยใช้ตัววนซ้ำนั้นค่อนข้างเร็ว และระหว่างนั้น การรบกวนของเธรดอื่นจะถูกแยกออก ในการทำงาน ตัววนซ้ำอาศัยสแน็ปช็อตของอาร์เรย์ที่ถ่ายเมื่อสร้างตัววนซ้ำ
นั่นคือทั้งหมดที่เกี่ยวกับการใช้งานCopyOnWriteArraySetใน Java อย่างที่บอกไปว่าเขาเป็นน้องCopyOnWriteArrayListชาย ดังนั้นหากคุณเข้าใจอย่างน้อยหนึ่งรายการ คุณสามารถใช้อีกรายการหนึ่งได้ ข้อแตกต่างเพียงอย่างเดียวคืออันหนึ่งคือList'' และอีกอันSetคือ '' ดังนั้นสิ่งนี้จึงนำมาซึ่งความแตกต่างทั้งหมดระหว่างโครงสร้างข้อมูลเหล่านี้ใน Java ตัวอย่างเช่นListลำดับขององค์ประกอบมีความสำคัญและอาจมีการซ้ำกัน แม้ว่าจะSetไม่เรียงลำดับ แต่ก็ไม่อนุญาตให้มีการทำซ้ำวัตถุ โปรดจำไว้เสมอว่าCopyOnWriteArraySetนี่คือCollectionชั้นเรียน พิเศษ ควรใช้เมื่อมีเงื่อนไขเอื้ออำนวยเท่านั้น ในกรณีอื่น คุณสามารถใช้การใช้งานเพื่อวัตถุประสงค์ทั่วไปได้ ตัวอย่างเช่นHashSetหรือLinkedHashSetคลาสคอลเลกชันที่ซิงโครไนซ์ ต้นฉบับ: วิธีใช้ CopyOnWriteArraySet ใน Java พร้อมตัวอย่าง
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION