JavaRush /مدونة جافا /Random-AR /كيفية استخدام 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)

مثال CopyOnWriteArray في 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هو ''، لذلك فإن هذا يستلزم وراثة جميع الاختلافات بين هياكل البيانات هذه في Java. على سبيل المثال، Listترتيب العناصر مهم وقد يحتوي على نسخ مكررة. على الرغم من Setأنها غير مرتبة، إلا أنها لا تسمح بتكرار الكائنات. تذكر دائمًا أن CopyOnWriteArraySetهذه Collectionفئة متخصصة. يجب استخدامه فقط عندما تكون الظروف مواتية. في أي حالة أخرى، يمكنك استخدام تطبيقات للأغراض العامة. على سبيل المثال، HashSetأو LinkedHashSetفئات التجميع المتزامنة. الأصل: كيفية استخدام CopyOnWriteArraySet في Java مع مثال
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION