JavaRush /בלוג Java /Random-HE /סנכרון חוטים, נעילת אובייקטים ונעילת מחלקה
CynepHy6
רָמָה
Великий Новгород

סנכרון חוטים, נעילת אובייקטים ונעילת מחלקה

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

נעילה ברמת אובייקט

זהו מנגנון לסנכרון של שיטה לא סטטית או בלוק קוד לא סטטי כך שרק שרשור אחד יכול להפעיל בלוק או מתודה נתונה במופע נתון של מחלקה. זה צריך להיעשות בכל פעם שאתה צריך להפוך את שרשור הנתונים ברמת המופע בטוח. דוגמא:
public class DemoClass{
    public synchronized void demoMethod(){}
}
אוֹ
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
אוֹ
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

נעילה ברמת הכיתה

מונע משרשורים מרובים להיכנס לבלוק מסונכרן במהלך הביצוע בכל אחד מהמופעים הזמינים של המחלקה. המשמעות היא שאם יש 100 מופעים של המחלקה במהלך הפעלת התוכנית DemoClass, אז רק שרשור אחד באותו זמן יוכל להפעיל demoMethod()בכל אחד מהמקרים, וכל שאר המקרים ייחסמו לשרשורים אחרים. זה הכרחי כאשר אתה צריך להפוך שרשור נתונים סטטי בטוח.
public class DemoClass{
    public synchronized static void demoMethod(){}
}
אוֹ
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
אוֹ
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

כמה הערות חשובות

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

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

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

  4. synchronizedב-Java , זה אומר שאם שיטה מסונכרנת קוראת לשיטה מסונכרנת אחרת שדורשת את אותו נעילה, השרשור הנוכחי שמחזיק את הנעילה יכול להיכנס לשיטה זו מבלי לרכוש את הנעילה.

  5. Синхронизация в Java будет бросать NullPointerException если an object используемый в синхронизированном блоке null. Например, в вышеприведенном примере codeа, если замок инициализируется How null, синхронизированный (lock) бросит NullPointerException.

  6. Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего applications. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков codeа для синхронизации только критических секций codeа.

  7. Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно or параллельно, потому что они захватывают замок на другой an object.

  8. В соответствии со спецификацией языка вы не можете использовать synchronized в конструкторе это приведет к ошибке компиляции.

  9. Не синхронизируйте по не финальному (no final) полю, потому что link, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных an objectх и уже не будет ниHowой синхронизации вообще. Лучше всего использовать класс String, который уже неизменяемый и финальный.

Удачи в обучении!! Оригинал: Object level lock vs Class level lock in Java
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION