it-swarm.dev

في أي حالات تكون CopyOnWriteArrayList مناسبة؟

أنا أتعلم عن CopyOnWriteArrayList class.

  • ما هو الغرض من نسخ مجموعة جديدة؟
  • هل من أجل المواضيع الأخرى قراءة المصفوفة؟

لذلك إذا كان النظام يحتوي على التزامن العالي ولم تقرأ معظم إجراءات مؤشرات الترابط عدم الكتابة ، فمن الأفضل استخدام CopyOnWriteArrayList.

67
huashui

كما هو مذكور في هذا link :

CopyOnWriteArrayList هي فئة تجميع متزامنة مقدمة في Java 5 Concurrency API مع ابن عمها الشهير ConcurrentHashMap في Java.

CopyOnWriteArrayList تنفذ واجهة قائمة مثل ArrayList و Vector و LinkedList ولكن في مجموعة آمنة لخيط المناقشة وتحقق أمان سلاسل العمليات الخاصة بها بطريقة مختلفة قليلاً عن Vector أو فئة تجميع آمنة لسلسلة العمليات.

كما يوحي الاسم ، يقوم CopyOnWriteArrayList بإنشاء نسخة من قائمة ArrayList الأساسية مع كل عملية تحويل على سبيل المثال إضافة أو تعيين. عادةً ما يكون CopyOnWriteArrayList مكلفًا للغاية لأنه يتضمن نسخة Array مكلفة مع كل عملية كتابة ولكن فعال للغاية إذا كان لديك قائمة حيث يفوق Iteration حدوث طفرة على سبيل المثال تحتاج غالبًا إلى تكرار قائمة ArrayList وعدم تعديلها كثيرًا.

Iterator لـ CopyOnWriteArrayList آمن من الفشل ولا يلقي ConcurrentModificationException حتى إذا تم تعديل CopyOnWriteArrayList الأساسي بمجرد بدء Iteration لأن Iterator يعمل على نسخة منفصلة من ArrayList. وبالتالي ، فإن جميع التحديثات التي تم إجراؤها على CopyOnWriteArrayList غير متاحة لـ Iterator.

للحصول على أحدث إصدار ، قم بقراءة جديدة مثل list.iterator();

ومع ذلك ، فإن تحديث هذه المجموعة كثيرًا سيقتل الأداء. إذا حاولت فرز CopyOnWriteArrayList ، فسترى القائمة ترمي UnsupportedOperationException (الفرز الذي تم استدعائه في المجموعة N مرات). يجب عليك استخدام هذه القراءة فقط عندما تقوم بأكثر من 90٪ من القراءات.

86
Ankur Lathi

ما هو الغرض من التعامل مع مجموعة جديدة؟

يضمن نسخ الصفيف الأساسي أن يكون أي تكرار لبنية البيانات آمنًا حيث أن التكرار يحدث عبر "لقطة" ثابتة من البيانات.

هل من أجل المواضيع الأخرى قراءة المصفوفة؟

نوعا ما. وبشكل أكثر تحديدًا ، يكون لكل مؤشر ترابط القدرة على تكرار الصفيف بأمان دون خوف من ConcurrentModificationException أو أي سلوك آخر غير معروف/غير معروف.

لذلك إذا كان النظام مرتفعًا وتقرن معظم إجراءات مؤشرات الترابط عدم الكتابة ، فمن الأفضل استخدام CopyOnWriteArrayList. هل انا على حق؟

لا. فقط إذا كانت معظم إجراءات سلاسل العمليات عبارة عن تكرارات على القائمة. إذا كانت معظم الأنشطة عبارة عن قراءات تستند إلى الوصول العشوائي ، فقد يكون ReadWriteLock أفضل.

من javadoc من CopyOnWriteArrayList

هذا عادة ما يكون مكلفًا للغاية ، ولكنه قد يكون أكثر فاعلية من البدائل عندما يكون اجتياز عدد العمليات يفوق عدد الطفرات إلى حد كبير ، ويكون مفيدًا عندما لا تستطيع أو لا ترغب في مزامنة عبارات ، ومع ذلك يلزم منع التدخل بين المواضيع المتزامنة.

23
Tim Bender