כיצד ליישם בצורה הטובה ביותר את מפת ה- Hash במקביל בג'אווה?



מאמר זה יציג בפניכם מושג הקרוי בשם Concurrent Hash Map ב- Java וימשיך אותו בהדגמה מעשית

מאמר זה יציג בפניכם מושג שנקרא בשם Conc Hash Hash In ועקוב אחריו באמצעות הדגמה מעשית. המצביעים הבאים יוסקרו במאמר זה,

ממשיך הלאה עם מאמר זה על Map Hash Concurrent ב- Java





כיצד ConcurrentHashMap עובד באופן פנימי?

מג'אווה 5 ואילך מוצגת ConcurrentHashMap כחלופה ל- HashTable. אנו יכולים גם לקבל מפה מסונכרנת בשיטת מחלקת השירות הנקראת synchronizedMap () אך יש חסרון בשיטה זו כלומר ביצועים ירודים מאוד מכיוון שרק חוט אחד יכול לגשת אליה בכל פעם. אז ConcurrentHashMap מטפל בבעיות אלה.



סוף סוף סופית בג'אווה

ממשיך הלאה עם מאמר זה על Map Hash Concurrent ב- Java

מדוע מפה אחרת?

למרות שכבר יש לנו HashMap, HashTable אז מה הצורך של ConcurrentHashMap, זה בגלל שהוא מספק ביצועים טובים יותר באותו זמן הוא בטוח לשרשור.

ממשיך הלאה עם מאמר זה על Map Hash Concurrent ב- Java



איך זה שונה?

זה מבוסס גם על hashing אבל הביצועים שלו משופרים על ידי אסטרטגיית הנעילה שלו. בניגוד ל- HashTable או ל- HashMap מסונכרן, הוא אינו מחיל את אותה נעילה על כל שיטה שהיא משתמשת במנעול נפרד לכל שיטה, היא משתמשת במנעול חוזר למטרה זו. בדומה ל- HashMap, ל- ConcurrentHashMap יש 16 דליים כלומר קטעים, כדי ליצור ConcurrentHashMap עם יותר מ -16 דליים יש לו קונסטרוקציות שונות.

לפני שנדבר בפירוט נסקור כמה מושגים להלן:

ConcurrentHashMap: מפה זו מאפשרת גישה לשרשור במקביל. רק חלק מהמפה שנקרא קטע כלומר מבנה הנתונים הבסיסי ננעל תוך כדי הוספה או עדכון של המפה. זה מאפשר גישה חוטים במקביל לקרוא את הנתונים מבלי לנעול. הוא הוצג כדי לשפר את הביצועים.

  • רמת המקבילות: זהו מספר שהוא מספר משוער של שרשורים המעדכנים במקביל.
  • גורם עומס: זהו ערך המשמש לבקרת גורם הגודל.
  • קיבולת ראשונית: זהו נכס שיוצר מפה עם הגודל המסופק.

בואו נראה את התרשים למטה וננסה להבין כיצד פועל ConcurrentHashMap.

תמונה- חשיפה בו זמנית- אדוריקה

אז בתרשים שלמעלה, יש לנו 16 מנעולים אשר נועלים רק חלק מהמפה הנדרש כדי שניתן יהיה לגשת לשיטות אחרות על ידי שרשורים שונים ובכך לשפר את הביצועים.

בדומה ל- HashMap, ConcurrentHashMap פועל בצורה דומה שהוא מכיל 16 פלחים כברירת מחדל ושומר רכיב על ידי hashing כך שאם לאלמנטים יש אותו hash הם מאוחסנים באותו קטע כפי שמוצג בתרשים לעיל בעזרת הרשימה המקושרת.

ממשיך הלאה עם מאמר זה על Map Hash Concurrent ב- Java

ההבדל בין ConcurrentHashMap ל- HashMap

HashMap שייך לאוספים בעוד ConcurrentHashMap שייך לאוספים בו זמנית אולם ישנם הבדלים רבים אחרים ביניהם.

  • ConcurrentHashMap הואחוט בטוח כלומרמסונכרן אך HashMap אינו מסונכרן.
  • ConcurrentHashMap נמוך בביצועים מכיוון שהוא מסונכרן מכיוון שלפעמים שרשורים צריכים לחכות אך HashMap מביא לביצועים גבוהים מכיוון שהוא אינו מסונכרן וכל שרשור יכול לגשת אליו בו זמנית.
  • נקבל ConcurrentModificationException אם שני שרשורים מנסים בו זמנית לשנות או להוסיף תוכן של אובייקט. עם זאת, במקרה של ConcurrentHashMap לא נקבל שום חריג בזמן ביצוע אותה פעולה.

  • ערכי אפס מותרים למפתח ולערכים ב- HashMap אולם ConcurrentHashMap אינו מאפשר ערכי null עבור המפתח והערך שניסה להוסיף ערך null נקבל חריג כלומר NullPointerException.

  • HashMap מוצג ב- JDK 1.2 ואילו ConcurrentHashMap מוצג ב- JDK 1.5.

כפי שראינו קודם לכן לביצועים טובים יותר, הוא מורכב ממערך צמתים כדלי שולחן שהיו פלחי טבלה לפני ג'אווה 8 .

הדליים מאותחלים בעצלתיים בעת ביצוע ההכנסה הראשונה. ניתן לנעול כל דלי באופן עצמאי על ידי נעילת הצומת הראשון של הדלי גם פעולות קריאה אינן חוסמות.

לְעוּמַת HashMap, ConcurrentHashMap מספק את התוספת concurrency רמת טיעון לבקרת מספר הנושאים המשוערים לשימוש.

קונסטרוקטורים:

  1. ConcurrentHashMap m = ConcurrentHashMap חדש ()

    נוצרת מפה ריקה חדשה עם קיבולת התחלתית ברירת מחדל של 16, גורם עומס של 0.75 ורמת מקבילות 16.

  2. ConcurrentHashMap m = ConcurrentHashMap חדש (int initialCapacity)
    נוצרת מפה ריקה חדשה עם קיבולת ראשונית מוגדרת, מקדם עומס של 0.75 ורמת מקביליות 16.

  3. ConcurrentHashMap m = ConcurrentHashMap חדש (int initialCapacity, float loadFactor)

    נוצרת מפה ריקה חדשה עם קיבולת ראשונית וגורם עומס עם רמת 16 במקביל.

  4. ConcurrentHashMap m = ConcurrentHashMap חדש (int initialCapacity, float loadFactor, int concurrencyLevel)
    נוצרת מפה ריקה חדשה עם קיבולת ראשונית, גורם עומס ורמת מקבילות מוגדרים.

  5. ConcurrentHashMap m = ConcurrentHashMap חדש (מפה m)
    יוצר ConcurrentHashMap חדש מהמפה המסופקת.

שני הטיעונים האחרים: initialCapacity ו- loadFactor עבדו בדיוק כמו HashMap.
ConcurrentMap הוא זיכרון עקבי בפעולות מפתח / ערך בסביבה מרובת הליכי משנה.

ממשיך הלאה עם מאמר זה על Map Hash Concurrent ב- Java

מלכודות

בזמן שאחזור אובייקטים ConcurrentHashMap אינו חסום ועשוי לחפוף עם פעולות העדכון, ולכן לקבלת ביצועים טובים יותר הם רק מאחזרים את פעולות העדכון שהושלמו לאחרונה.

תוצאות של שיטות סטטוס מצטברות כולל גודל, isEmpty, ו- containValue בדרך כלל שימושיות רק כאשר מפה אינה עוברת עדכונים מקבילים בשרשורים אחרים.

אם עדכונים מקבילים נשלטים כראוי שיטות סטטוס אלה יכולות להיות אמינות.

למרות ששיטות אלה אינן מתחייבות בזמן אמת.

כיצד להשתמש בפייתון אנקונדה

קיבולת הטבלה המוגדרת כברירת מחדל היא 16 אולם אנו יכולים לשנות אותה באמצעות רמת מקביליות.

public ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel) {// ... if (initialCapacity

אם מקשי המקשים נדרשים להיות לפי סדר מיון נוכל להשתמש ב- ConcurrentSkipListMap.

כעת לאחר ביצוע התוכנית שלעיל היית מבין את מפת ה- Hash בו זמנית בג'אווה. לפיכך הגענו לסוף מאמר זה בנושא אם ברצונך ללמוד עוד, עיין ב , חברת למידה מקוונת אמינה. קורס ההכשרה וההסמכה של Java J2EE ו- SOA של אדוריקה נועד להכשיר אותך לקונספטים מרכזיים של Java וגם עם מסגרות Java שונות כמו Hibernate & Spring.

יש לך שאלה עבורנו? אנא הזכיר זאת בסעיף ההערות במאמר זה ונחזור אליך בהקדם האפשרי.