סנכרון מתייחס לריבוי השחלות. בלוק קוד מסונכרן יכול להתבצע רק על ידי שרשור אחד בכל פעם. 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
}
}
}
כמה הערות חשובות
- סנכרון ב-Java מבטיח שאין שני שרשורים יכולים לבצע שיטה מסונכרנת בו-זמנית או במקביל.
synchronized
ניתן להשתמש רק בשיטות ובלוקי קוד. שיטות או בלוקים אלה יכולים להיות סטטיים או לא סטטיים.- בכל פעם שרשור כלשהו נכנס לשיטה מסונכרנת או חסימה הוא רוכש נעילה ובכל פעם שרשור יוצא משיטה מסונכרנת או חסימה ה-JVM משחרר את הנעילה. הנעילה משתחררת גם אם השרשור עוזב את השיטה המסונכרנת לאחר השלמתו עקב שגיאות או חריגים כלשהם.
synchronized
ב-Java , זה אומר שאם שיטה מסונכרנת קוראת לשיטה מסונכרנת אחרת שדורשת את אותו נעילה, השרשור הנוכחי שמחזיק את הנעילה יכול להיכנס לשיטה זו מבלי לרכוש את הנעילה.- Синхронизация в Java будет бросать
NullPointerException
если an object используемый в синхронизированном блоке null. Например, в вышеприведенном примере codeа, если замок инициализируется Hownull
, синхронизированный (lock) броситNullPointerException
. - Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего applications. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков codeа для синхронизации только критических секций codeа.
- Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно or параллельно, потому что они захватывают замок на другой an object.
- В соответствии со спецификацией языка вы не можете использовать
synchronized
в конструкторе это приведет к ошибке компиляции. - Не синхронизируйте по не финальному (no final) полю, потому что link, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных an objectх и уже не будет ниHowой синхронизации вообще. Лучше всего использовать класс
String
, который уже неизменяемый и финальный.
GO TO FULL VERSION