CopyOnWriteArraySet
זה האח הצעיר של הכיתה
CopyOnWriteArrayList
. אלו הם קבוצה מיוחדת של שיעורים שנוספו ב-JDK 1.5 יחד עם בן דודם הפופולרי יותר
ConcurrentHashMap
. הם חלק מהחבילה
concurrent collection framework
וממוקמים בחבילה
java.util.concurrent
.
CopyOnWriteArraySet
מתאים ביותר לאוספים לקריאה בלבד שגודלם קטן מספיק כדי להעתיק אותם אם מתרחשות פעולות שינוי מסוימות. לדוגמה, תוכל להשתמש
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;
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);
}
}
תְפוּקָה:
[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
המתאים ביותר ליישומים שבהם:
- הגדלים
Set
של ה-'s נוטים להישאר קטנים.
- פעולות
read-only
עדיפות באופן משמעותי על פעולות שמשנות אובייקטים.
- עליך למנוע הפרעה בין חוטים במהלך המעבר
Set
.
- יתרון נוסף
CopyOnWriteArraySet
הוא בטיחות החוטים. אוסף זה תומך במקביל.
- פעולות מוטטיביות (הוספה, שינוי, מחיקה וכו') הן יקרות כי הן דורשות בדרך כלל העתקה של כל המערך הבסיסי.
- איטרטורים אינם תומכים בפעולת המחיקה המוטטיבית.
- מעבר באמצעות איטרטור הוא די מהיר ובמהלכו הפרעה של חוטים אחרים אינה נכללת. כדי לפעול, האיטרטורים מסתמכים על תמונת מצב של המערך שצולמה כאשר האיטרטור נוצר.
זה הכל לגבי השימוש
CopyOnWriteArraySet
בג'אווה. כפי שאמרתי, הוא האח הצעיר
CopyOnWriteArrayList
. אז אם אתה מבין לפחות אחד מהם, אתה יכול להשתמש בשני. ההבדל היחיד הוא שאחד הוא
List
'' והשני
Set
הוא '', כך שזה כרוך בירושה של כל ההבדלים בין מבני הנתונים הללו בג'אווה. לדוגמה,
List
סדר האלמנטים חשוב ויכול להכיל כפילויות. בזמן
Set
שאינו מסודר, הוא אינו מאפשר שכפול של חפצים. זכרו תמיד שמדובר
CopyOnWriteArraySet
בשיעור מיוחד
Collection
. יש להשתמש בו רק כאשר התנאים נוחים. בכל מקרה אחר, אתה יכול להשתמש ביישומים למטרות כלליות. לדוגמה,
HashSet
או
LinkedHashSet
שיעורי איסוף מסונכרנים. מקור:
כיצד להשתמש ב-CopyOnWriteArraySet ב-Java עם דוגמה
GO TO FULL VERSION