
הטקסט המלא של הדקות הראשונות בהרצאה «הדגמה של Singleton - חלק 10» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
טוב, אז בשיעור הקודם הצגנו את הבעיה, מה קורה כאשר שני סרדים רצים ומנסים לגשת במקביל אל אובייקט שאמור להיות סינגלטון, וראינו שמשבשים את ההגדרה של הסינגלטוניות של האובייקט.
אז נשאלה, שאלנו שאלה, מה הפתרון לדבר הזה? ואיך אנחנו מונעים כזאת תקלה בעצם? אז היום אנחנו נפתור את הבעיה הזאת. אוקיי, אז איפה בעצם הבעיה? אז הבעיה בעצם ראינו שהיא נוצרת כאשר Thread ראשון שואל את השאלה הזו, ואז מקבל תשובה חיובית, שכן, Instance אכן שווה ל-Null, והוא כבר בשורה הזו.
ואז מגיע Thread אחר, וגם הוא שואל את השאלה הזו בו זמנית, וגם הוא מגיע אל הנקודה הזו. זהו, זו הצהרה, מכאן כבר הכל משתבש. אז השאלה היא, אז איך פותרים דבר כזה?
אז התשובה היא מאוד פשוטה, למעשה מה שאנחנו רוצים לעשות זה להפוך את כל האזור הזה לאזור מוגן, אזור נעול, גן נעול, שרק thread אחד יכול להיות בתוכו.
אז השרד הראשון שיצליח להיכנס, נגדיר פה איזשהו שער, השרד הראשון שיעבור את השער ינעל אותו אחריו בעצם, ויהפוך את האזור הזה לנעול, כך שהשרד השני שיגיע לשער ימתין פה עד שהשרד הראשון יצא החוצה.
אז יוצא שהשרד הראשון יצא החוצה רק אחרי, אם הוא החליט להיכנס, אז זה רק בגלל שהוא ראה שאינסטנס שווה לנעל, אבל תוך כדי הוא יהפוך את אינסטנס למשהו שונה מנעל, ורק אז הוא יצא.
ואז השרד השני שהמתין בשער, כשהוא ייכנס והוא יבצע את העיף, הוא יגיע למסקנה שאינסטנס כבר לא נעל. אז הוא לא יבצע את הבלוק.
הוא רק יחזיר את הערך שכבר השרד הראשון שינה מנעל. יפה. אז כל מה שאנחנו רוצים לעשות זה לעטוף את האזור הזה בלוק. יפה, אז בואו נעצור את הריצה ואכבא ימני על האזור הזה ותראונד וויד ולוק דאבל קליק יפה מאוד אז אנחנו עכשיו עושים לוק על דיס ורק קסרד אחד יכול להיות בתוך הלוק יפה מאוד אלא מה שיש לנו פה אדמומיות עכשיו אם נעשה f8 נגיע
לתקלה אז דאבל קליק אז הוא אומר keyword this is not valid in a static property static method or static field initializer אז לנו יש static property אנחנו בסטטיק פרופרטי בסטטיק פרופרטי this היא לא מילה וליטית היא לא מילה שמותר שיש לה משמעות בכלל יפה עכשיו כל מה שאנחנו רוצים זה איזשהו מין משהו שאפשר לנעול אודותיו אפשר להשתמש בו כמנעול
זה כל מה שאנחנו רוצים דיס הוא מאוד נוח אם היה לנו אבל אין לנו אז מה אנחנו עושים בכזה מצב אנחנו בעצם רוצים סתם איזשהו משהו משותף שאפשר לנעול אודותיו.
במצב כזה מה שנהוג לעשות זה מאוד הגיוני זה להגדיר פרייבט סטטיק כדי שהוא יהיה זמין תמיד כי אין לנו פה אנחנו אין אנחנו גם לפני שנוצר האובייקט אנחנו רוצים אנחנו רוצים תמיד אנחנו רוצים, בקיצור, אנחנו רוצים מתוך static לנעול.
מתוך static לנעול. אי אפשר שהמנעול לא יהיה static. המנעול חייב להיות static. אחרת הוא לא יהיה זמין. אז static, עכשיו, המנעול שלנו פשוט אובג'קט.
כי כל אובג'קט ומה שיורש מהאובג'קט יכול להיות מנעול. אז זה יהיה אובג'קט, אבל המנעול עצמו נקרא sync שווה new object. זהו, יש לנו מנעול.
אז עכשיו אני יכול להשתמש בסינק בתור המנעול, במקום דיס אני מגדיר את סינק בתור המנעול. יפה מאוד. אז בזמן ריצה, ה-thread שלנו ינסה לנעול אודות סינק, הראשון שינסה יצליח, כן, בעצם ייכנס לשער וינעל אותו, יבצע את כל הבלוק, ורק ביציאה מהבלוק יפתח את המנעול ואז ה-thread הראשון שחיכה
בתור יוכל להיכנס גם הוא. יפה אבל הראשון שנכנס האינסטנס יהיה נל ואז הוא יבצע את הקוד הזה השני שייכנס כבר אינסטנס לא יהיה נל כי הראשון בוודאי אם הוא בדק וראה שאינסטנס הוא נל כבר הפך אותו ללא נל.
אוקיי אז אוקיי אז בואו נריץ למערכת עכשיו יש לנו ברייק פוינט רק בתוך האיף מה שאומר שהתרד הראשון שיצליח להיכנס אז הוא יגיע לברייק פוינט אז בואו נריץ את זה ואז נראה מה אנחנו עושים אוקיי אז התרד הראשון שהגיע הוא אודיו סרד יפה מאוד עכשיו איפה נמצא הוידאו סרד דאבל קליק הוידאו סרד הוא ירוק על לוק מה זה אומר זה אומר שהוא כרגע בווייט סטייט
הוא בהמתנה כי הוא ביצע את השורה הזו זאת אומרת הוא ניסה לפתוח את המנעול אבל בזה שמנסים לפתוח מנעול שמוחזק המפתח לא מוחזק על ידי מי שכבר נכנס לתוך הגן הנעול אז מי שמנסה לפתוח את המנעול הזה חוטף זרם חשמלי, שוק חשמלי, ומוקפא, חוטף הקפאה.
וה-thread, כן, בואו נעבור ל-audio thread, ה-audio thread הוא זה שמחזיק את המפתח. רק כשהוא יצא הוא ישחרר את המנעול, ואז שחרור המנעול יעיר את ה-thread הקפוא. אוקיי, אז בואו נחזור, כן, אז אנחנו עכשיו בתוך ה-thread הקפוא, אני יכול, מה שאפשר פשוט לעשות, ניתן למערכת לרוץ ואז ה-thread השני יגיע גם הוא ל-breakpoint.
אז אני מריץ, אוקיי, ה-thread, בוא נראה איזה, אודיו פרוק, בוא נראה איפה נמצא הוידאו, הוידאו נמצא ב-send והאודיו נמצא גם הוא ב-send.
אה, כי ה-thread השני בכלל לא נכנס לאיף, ה-thread השני יכולנו לראות אותו כאן, אבל אם אני שם כאן breakpoint, ה-thread השני לא יראה ש-instance שווה ל-null.
אתם יכולים לשחק עם זה בכל מקרה, זה תחום ששייך יותר לקורס של Advanced C-Sharp, ששם אנחנו מלמדים Threadים ונעילה, את כל הנושאים האלה של סנכרון Threadים.
אוקיי, אז הבנו את הרעיון במערכת פשוטה קטנה