كيف يمكن تنفيذ خريطة التجزئة المتزامنة بشكل أفضل في جافا؟



ستقدم لك هذه المقالة مفهومًا يسمى خريطة التجزئة المتزامنة في جافا ومتابعتها بعرض عملي

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

المضي قدما مع هذه المقالة على خريطة التجزئة المتزامنة في جافا





كيف يعمل ConcurrentHashMap داخليا؟

من Java 5 فصاعدًا ، تم تقديم ConcurrentHashMap كبديل لـ HashTable. يمكننا أيضًا الحصول على خريطة متزامنة باستخدام طريقة فئة الأداة المساعدة التي تسمى synizedMap () ولكن هناك عيبًا في هذه الطريقة ، أي أداء ضعيف للغاية حيث يمكن فقط لمؤشر واحد الوصول إليه في وقت واحد. لذا فإن برنامج ConcurrentHashMap يعالج هذه القضايا.



المضي قدما مع هذه المقالة على خريطة التجزئة المتزامنة في جافا

لماذا خريطة أخرى؟

على الرغم من أن لدينا بالفعل HashMap و HashTable فما هو مطلوب من ConcurrentHashMap ، لأنه يوفر أداءً أفضل في نفس الوقت فهو آمن على مؤشر الترابط.

المضي قدما مع هذه المقالة على خريطة التجزئة المتزامنة في جافا



كيف هو مختلف؟

يعتمد أيضًا على التجزئة ولكن تم تحسين أدائه من خلال استراتيجية القفل الخاصة به. على عكس HashTable أو Synchronized HashMap ، فإنه لا يطبق نفس القفل على كل طريقة يستخدمها قفلًا منفصلاً لكل طريقة ، ويستخدم قفل إعادة الدخول لهذا الغرض. على غرار HashMap ، يحتوي ConcurrentHashMap على 16 دلوًا ، أي مقاطع ، لإنشاء ConcurrentHashMap مع أكثر من 16 دلاء لها منشآت مختلفة.

قبل التحدث بالتفصيل ، دعونا نراجع بعض المفاهيم أدناه:

ConcurrentHashMap: تسمح هذه الخريطة بالوصول المتزامن لمؤشر الترابط. جزء فقط من الخريطة يسمى المقطع ، أي يتم قفل بنية البيانات الأساسية أثناء إضافة الخريطة أو تحديثها. يسمح بالوصول المتزامن إلى مؤشر الترابط لقراءة البيانات دون قفل. تم تقديمه لتحسين الأداء.

  • مستوى التزامن: هو رقم يمثل عددًا تقديريًا من سلاسل الرسائل التي يتم تحديثها بشكل متزامن.
  • عامل التحميل: قيمة تستخدم للتحكم في عامل تغيير الحجم.
  • السعة الأولية: هي خاصية تنشئ خريطة بالحجم المقدم.

دعونا نرى الرسم التخطيطي أدناه ونحاول فهم كيفية عمل ConcurrentHashMap.

صورة- Hashmap المتزامن- Edureka

ما هو التجميع في جافا

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

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

المضي قدما مع هذه المقالة على خريطة التجزئة المتزامنة في جافا

الفرق بين ConcurrentHashMap و HashMap

ينتمي HashMap إلى المجموعات بينما ينتمي ConcurrentHashMap إلى المجموعات المتزامنة ولكن هناك العديد من الاختلافات الأخرى بينهما.

  • ConcurrentHashMap هوأي موضوع آمنمتزامن ولكن HashMap غير متزامن.
  • إن ConcurrentHashMap منخفض الأداء لأنه متزامن لأنه في بعض الأحيان يجب أن تنتظر الخيوط ولكن HashMap عالية الأداء لأنها غير متزامنة ويمكن لأي مؤشرات ترابط الوصول إليها في وقت واحد.
  • سوف نحصل على ConcurrentModificationException إذا كان هناك سلسلتان تحاولان في نفس الوقت تعديل أو إضافة محتويات الكائن. ومع ذلك ، في حالة ConcurrentHashMap ، فلن نحصل على أي استثناء أثناء إجراء نفس العملية.

  • يُسمح بالقيم الفارغة للمفتاح والقيم في HashMap ، ومع ذلك ، لا يسمح ConcurrentHashMap بقيم فارغة للمفتاح والقيمة التي حاولت إضافة قيمة فارغة ، وسنحصل على استثناء ، أي NullPointerException.

  • تم تقديم HashMap في JDK 1.2 بينما تم تقديم ConcurrentHashMap في JDK 1.5.

كما رأينا سابقًا للحصول على أداء أفضل ، فهي تتكون من مجموعة من العقد كمستودعات للجدول كانت عبارة عن مقاطع جدول قبل جافا 8 .

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

مقارنة ب HashMap ، ConcurrentHashMap يوفر الاضافي التزامنالمستوى حجة للتحكم في عدد الخيوط المقدرة لاستخدامها.

جافا للمطور الأمامي استئناف

المنشئون:

  1. ConcurrentHashMap m = جديد ConcurrentHashMap ()

    يتم إنشاء خريطة فارغة جديدة بسعة أولية افتراضية تبلغ 16 ، وعامل تحميل 0.75 ومستوى التزامن 16.

  2. ConcurrentHashMap m = New ConcurrentHashMap (int initialCapacity)
    يتم إنشاء خريطة فارغة جديدة بسعة أولية محددة ، وعامل تحميل 0.75 ومستوى التزامن 16.

  3. ConcurrentHashMap m = خريطة ConcurrentHashMap جديدة (سعة أولية int ، عائمة loadFactor)

    يتم إنشاء خريطة فارغة جديدة بسعة مبدئية محددة وعامل تحميل بمستوى التزامن 16.

  4. ConcurrentHashMap m = خريطة ConcurrentHashMap جديدة (سعة أولية int ، تعويم loadFactor ، int concurrencyLevel)
    يتم إنشاء خريطة فارغة جديدة بسعة أولية محددة وعامل تحميل ومستوى التزامن.

  5. ConcurrentHashMap m = خريطة ConcurrentHashMap جديدة (خريطة م)
    ينشئ خريطة ConcurrentHashMap جديدة من الخريطة المتوفرة.

المعاملتان الأخريان: initialCapacity و loadFactor يعملان تمامًا مثل HashMap.
ConcurrentMap هي ذاكرة متسقة في عمليات المفتاح / القيمة في بيئة متعددة الخيوط.

المضي قدما مع هذه المقالة على خريطة التجزئة المتزامنة في جافا

المزالق

أثناء استرداد الكائنات ، لا يتم حظر ConcurrentHashMap وقد يتداخل مع عمليات التحديث ، وبالتالي لأداء أفضل لا يستردون سوى أحدث عمليات التحديث المكتملة.

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

إذا تم التحكم في التحديثات المتزامنة بشكل صحيح ، يمكن أن تكون طرق الحالة هذه موثوقة.

جافا كيفية استخدام الحبل

على الرغم من أن هذه الأساليب لا تضمن في الوقت الحقيقي.

سعة الجدول الافتراضية هي 16 ولكن يمكننا تغييرها باستخدام مستوى التزامن.

عمومية ConcurrentHashMap (int initialCapacity ، float loadFactor ، int concurrencyLevel) {// ... if (initialCapacity

إذا كانت المفاتيح مطلوبة لتكون في ترتيب مرتبة ، فيمكننا استخدام ConcurrentSkipListMap.

الآن بعد تنفيذ البرنامج أعلاه ، ستكون قد فهمت خريطة التجزئة المتزامنة في جافا. وهكذا وصلنا إلى نهاية هذه المقالة حول إذا كنت ترغب في معرفة المزيد ، تحقق من ، شركة تعليمية موثوقة عبر الإنترنت. تم تصميم دورة تدريب وإصدار شهادات Java J2EE و SOA من Edureka لتدريبك على مفاهيم Java الأساسية والمتقدمة جنبًا إلى جنب مع العديد من أطر Java مثل Hibernate & Spring.

لديك سؤال لنا؟ يرجى ذكرها في قسم التعليقات بهذه المقالة وسنعاود الاتصال بك في أقرب وقت ممكن.