JavaRush /בלוג Java /Random-HE /כיצד להשתמש ב-CopyOnWriteArraySet ב-Java עם דוגמה (תרגום)...
Lam-lam
רָמָה

כיצד להשתמש ב-CopyOnWriteArraySet ב-Java עם דוגמה (תרגום)

פורסם בקבוצה
CopyOnWriteArraySetזה האח הצעיר של הכיתה CopyOnWriteArrayList. אלו הם קבוצה מיוחדת של שיעורים שנוספו ב-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. בדוגמה שלנו, השתמשנו בדפוס המנוי המפרסם כדי להדגים את השימוש בו. רוב המנויים רשומים במהלך השקת האפליקציה והמשימה העיקרית של המוציא לאור היא למנות אותם ולהודיע ​​להם על כל עדכונים. הוספות ומחיקות של מנויים עשויות להתרחש מעת לעת. מכיוון שאנו זקוקים לעקיפה מהירה, 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מיישמת את ממשקי Collectionו Set, כמו גם, הוספה ב-JDK 1.5, יחד עם יישום מותאם אישית נוסף של Set'a, EnumSet. זה גם Setכזה שמשתמש פנימי CopyOnWriteArrayListעבור כל הפעולות שלו. לפיכך, הוא חולק את אותם מאפיינים בסיסיים של מחלקה זו. מכיוון שזה לא SortedSet, סדר האלמנטים אינו מובטח במהלך האיטרציה. כיצד להשתמש ב-CopyOnWriteArraySet ב-Java עם דוגמה (תרגום) - 2
  1. CopyOnWriteArraySetהמתאים ביותר ליישומים שבהם:

    • הגדלים Setשל ה-'s נוטים להישאר קטנים.
    • פעולות read-onlyעדיפות באופן משמעותי על פעולות שמשנות אובייקטים.
    • עליך למנוע הפרעה בין חוטים במהלך המעבר Set.
  2. יתרון נוסף CopyOnWriteArraySetהוא בטיחות החוטים. אוסף זה תומך במקביל.
  3. פעולות מוטטיביות (הוספה, שינוי, מחיקה וכו') הן יקרות כי הן דורשות בדרך כלל העתקה של כל המערך הבסיסי.
  4. איטרטורים אינם תומכים בפעולת המחיקה המוטטיבית.
  5. מעבר באמצעות איטרטור הוא די מהיר ובמהלכו הפרעה של חוטים אחרים אינה נכללת. כדי לפעול, האיטרטורים מסתמכים על תמונת מצב של המערך שצולמה כאשר האיטרטור נוצר.
זה הכל לגבי השימוש CopyOnWriteArraySetבג'אווה. כפי שאמרתי, הוא האח הצעיר CopyOnWriteArrayList. אז אם אתה מבין לפחות אחד מהם, אתה יכול להשתמש בשני. ההבדל היחיד הוא שאחד הוא List'' והשני Setהוא '', כך שזה כרוך בירושה של כל ההבדלים בין מבני הנתונים הללו בג'אווה. לדוגמה, Listסדר האלמנטים חשוב ויכול להכיל כפילויות. בזמן Setשאינו מסודר, הוא אינו מאפשר שכפול של חפצים. זכרו תמיד שמדובר CopyOnWriteArraySetבשיעור מיוחד Collection. יש להשתמש בו רק כאשר התנאים נוחים. בכל מקרה אחר, אתה יכול להשתמש ביישומים למטרות כלליות. לדוגמה, HashSetאו LinkedHashSetשיעורי איסוף מסונכרנים. מקור: כיצד להשתמש ב-CopyOnWriteArraySet ב-Java עם דוגמה
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION