הפניות חלשות בג'אווה

1. סקירה כללית

במאמר זה נבחן את המושג התייחסות חלשה - בשפת Java.

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

2. הפניות חלשות

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

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

ראשית, אספן האשפה מנקה התייחסות חלשה, כך שהמפנה כבר אינו נגיש. ואז ההפניה ממוקמת בתור הפניה (אם קיים קשר כלשהו) ממנו נוכל להשיג אותו.

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

2.1. הפניות חלשות לעומת רכות

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

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

  • המפנה אינו נגיש מאוד
  • לאחרונה לא ניתן לגשת להתייחסות הרכה

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

3. השתמש במקרים

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

כמובן, ה השימוש המוכר ביותר בהתייחסויות אלה הוא WeakHashMap מעמד. זה יישום ה- מַפָּה ממשק שבו כל מפתח מאוחסן כהפניה חלשה למפתח הנתון. כאשר אספן האשפה מסיר מפתח, הישות המשויכת למפתח זה נמחקת גם כן.

למידע נוסף, עיין במדריך שלנו ל- WeakHashMap.

אזור נוסף בו ניתן להשתמש בהם הוא בעיית המאזין פג.

מו"ל (או נושא) מחזיק בהתייחסויות חזקות לכל המנויים (או המאזינים) כדי להודיע ​​להם על אירועים שהתרחשו. הבעיה מתעוררת כאשר מאזין אינו מצליח לבטל את הרישום למו"ל.

לכן, לא ניתן לאסוף אשפה מאזין מכיוון שהתייחסות חזקה לכך עדיין זמינה למו"ל. כתוצאה מכך, דליפות זיכרון עלולות לקרות.

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

4. עבודה עם הפניות חלשות

הפניות חלשות מיוצגות על ידי java.lang.ref.WeakReference מעמד. אנו יכולים לאתחל אותו על ידי העברת רפרנט כפרמטר. באופן אופציונלי, אנו יכולים לספק א java.lang.ref.ReferenceQueue:

רפרנט אובייקט = אובייקט חדש (); ReferenceQueue referenceQueue = חדש ReferenceQueue (); WeakReference weakReference1 = WeakReference חדש (רפרנט); WeakReference weakReference2 = WeakReference חדש (referent, referenceQueue); 

את המפנה של הפניה ניתן להשיג על ידי לקבל והוסרה ידנית באמצעות ברור שיטה:

אובייקט referent2 = weakReference1.get (); weakReference1.clear (); 

הדפוס לעבודה בטוחה עם הפניות מסוג זהה לזה של הפניות רכות:

אובייקט referent3 = weakReference2.get (); אם (referent3! = null) {// GC עדיין לא הסיר את המופע} אחר {// GC פינה את המופע}

5. מסקנה

במדריך מהיר זה, הסתכלנו על הרעיון הנמוך של הפניה חלשה ב- Java - והתמקדנו בתרחישים הנפוצים ביותר לשימוש בהם.