מועד א' תש"ע 89-210

קישור למבחן

קווים מנחים לתשובות:

שאלה 3:

א)  ניתן לראות את התשובה בתרגול 7, אפשרי היה להשתמש בכל אחד מסוגי ה thread pool שראינו כדי שהתוכנית תעבוד.

ב)  גם כאן ניתן לראות את התשובה בתרגול 7, תשובה אפשרית יכול להיראות כך:

Timer t=new Timer();
t.scheduleAtFixedRate(new TimerTask(){
public void run() {
System.out.println("Home");
}
}, 0, 1000);

t.scheduleAtFixedRate(new TimerTask(){
public void run() {
System.out.println("Sweet");
}
}, 500, 1000);

ג) לגבי טענות א' ו ג' : ברגע שהשתמשנו ב sleep אין הבטחה שנחזור לעבוד מייד אח"כ, הת'רד רק חוזר לתור העדיפויות וממתין שישלף משם ע"י המתזמן של ה JVM, ולכן התזמון יכול להיפגע.

שימו לב שבתוכנית הראשונה ההמתנות שבתוך המשימות נבלעות למעשה ע"י ניהול התור, ואילו ההמתנות שליד חילוץ הערך המוחזר, הן הבעיתיות כמוזכר לעיל.

שאלה 4:

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

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

ניתן להשתמש במשתנה אטומי במקום, או לסנכרן כמה מקמות בקוד שכוללים גם את ההגדלה וגם את יצירת הקובץ ב CTOR

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

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

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

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

היו טעויות שנבעו מחוסר הבנה של המחלקה File (מצביע לקובץ או לתיקייה)  או שעל אותה הטעות הרחיבו פעמיים לדוגמא 2 ביטויים של בעיית חוסר החסינות לת'רדים

בהצלחה!