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