HashMap مقابل. ConcurrentHashMap مقابل. SynchronizedMap - كيف يمكن مزامنة HashMap في Java

نشرت: 2015-01-29

Crunchify ConcurrentHashMap مقابل. مثال SynchronizedMap HashMap هي بنية بيانات قوية جدًا في Java. نستخدمه كل يوم وتقريباً في جميع التطبيقات. هناك عدد قليل جدًا من الأمثلة التي كتبتها من قبل حول كيفية تنفيذ ذاكرة التخزين المؤقت لـ Threadafe ، وكيفية تحويل Hashmap إلى Arraylist؟

استخدمنا Hashmap في كلا المثالين أعلاه ، لكن هذه حالات استخدام بسيطة جدًا لـ Hashmap. HashMap is a non-synchronized .

هل لديك أي من الأسئلة أدناه؟

  • ما الفرق بين ConcurrentHashMap و Collections.synchronizedMap (Map)؟
  • ما الفرق بين ConcurrentHashMap و Collections.synchronizedMap (Map) من حيث الأداء؟
  • ConcurrentHashMap مقابل Collections.synchronizedMap ()
  • أسئلة مقابلة HashMap الشائعة و ConcurrentHashMap

في هذا البرنامج التعليمي سوف نتجاوز جميع الاستعلامات المذكورة أعلاه والسبب في ذلك why and how يمكننا مزامنة Hashmap؟

لماذا ا؟

كائن الخريطة عبارة عن حاويات ارتباطية تخزن العناصر ، وتتكون من مجموعة من key تعريف فريد value معينة. إذا كان لديك تطبيق متزامن للغاية قد ترغب في تعديل أو قراءة قيمة المفتاح في سلاسل مختلفة ، فمن المثالي استخدام Concurrent Hashmap. أفضل مثال على ذلك هو Producer Consumer الذي يتعامل مع القراءة / الكتابة المتزامنة.

إذن ماذا تعني خريطة خيط آمن؟ في حالة وصول multiple threads إلى خريطة تجزئة بشكل متزامن ، ويقوم واحد على الأقل من الخيوط بتعديل الخريطة هيكليًا ، must be synchronized externally لتجنب عرض المحتويات غير المتناسق.

كيف؟

هناك طريقتان يمكننا من خلالهما مزامنة HashMap

  1. طريقة synizedMap () لمجموعات Java
  2. استخدم ConcurrentHashMap

ConcurrentHashMap

  • يجب عليك استخدام ConcurrentHashMap عندما تحتاج إلى تزامن عالٍ جدًا في مشروعك.
  • إنه مؤشر ترابط آمن دون مزامنة whole map .
  • يمكن أن تحدث القراءات بسرعة كبيرة أثناء إجراء الكتابة بقفل.
  • لا يوجد قفل على مستوى الكائن.
  • يكون القفل في مستوى حبيبات أدق بكثير على مستوى دلو التجزئة.
  • لا يقوم ConcurrentHashMap بإلقاء ConcurrentModificationException إذا حاول أحد الخيوط تعديله بينما يقوم مؤشر ترابط آخر بالتكرار عليه.
  • يستخدم ConcurrentHashMap العديد من الأقفال.

SynchronizedHashMap

  • التزامن على مستوى الكائن.
  • تحتاج كل عملية قراءة / كتابة إلى الحصول على قفل.
  • يعد تأمين المجموعة بأكملها بمثابة عبء في الأداء.
  • يتيح هذا بشكل أساسي الوصول إلى مؤشر ترابط واحد فقط للخريطة بأكملها ويحظر جميع سلاسل الرسائل الأخرى.
  • قد يسبب الخلاف.
  • يُعيد SynchronizedHashMap Iterator ، الذي يفشل بسرعة في التعديل المتزامن.

الآن دعونا نلقي نظرة على الكود

  1. قم بإنشاء فئة CrunchifyConcurrentHashMapVsSynchronizedHashMap.java
  2. إنشاء كائن لكل HashTable و SynchronizedMap و CrunchifyConcurrentHashMap
  3. قم بإضافة واسترداد 500 ألف إدخال من الخريطة
  4. قم بقياس وقت البدء والانتهاء ووقت العرض بالمللي ثانية
  5. سوف نستخدم ExecutorService لتشغيل 5 threads ترابط بالتوازي

هنا كود جافا:

  • تعني shutdown() أن خدمة المنفذ لا تستغرق المزيد من المهام الواردة.
  • تم استدعاء awaitTermination() بعد طلب إيقاف التشغيل.

وبالتالي ، تحتاج أولاً إلى إيقاف تشغيل serviceExecutor ثم حظر وانتظار سلاسل الرسائل حتى تنتهي.

نتيجة وحدة التحكم في الكسوف: