Mövzu sinxronizasiyası, obyektin kilidlənməsi və sinifin kilidlənməsi - 1Sinxronizasiya çox iş parçacığına aiddir. Sinxronlaşdırılmış kod bloku eyni anda yalnız bir başlıq tərəfindən icra edilə bilər. Java icra üçün çoxlu mövzuları dəstəkləyir. Bu, iki və ya daha çox mövzunun eyni sahəyə və ya obyektə daxil olması ilə nəticələnə bilər. Sinxronizasiya proqramdakı bütün paralel iplərin sinxron işləməsinə imkan verən bir prosesdir. Sinxronizasiya paylaşılan yaddaşa qeyri-sabit girişin səbəb olduğu yaddaş ardıcıllığı xətalarının qarşısını alır. Metod sinxronlaşdırılmış kimi elan edildikdə, ip metodu icra olunan obyekt üçün monitor saxlayır. Başqa bir başlıq sinxronlaşdırılmış metodu icra edirsə, digər ip monitoru buraxana qədər sizin ipiniz bloklanacaq. Sinxronizasiya Java-da qorunan sözdən istifadə etməklə həyata keçirilir synchronized. Sinxronlaşdırılmış metodları və ya blokları müəyyən edərək dərslərinizdə istifadə edə bilərsiniz. synchronizedSiz sinif tərifində dəyişənlər və ya atributlarda istifadə edə bilməyəcəksiniz .

Obyekt səviyyəsində kilidləmə

Bu, statik olmayan metodun və ya qeyri-statik kod blokunun sinxronizasiya mexanizmidir ki, yalnız bir iplik sinifin verilmiş nümunəsində verilmiş bloku və ya metodu icra edə bilər. Nümunə səviyyəsində məlumat ipini təhlükəsiz etmək lazım olduqda bunu etmək lazımdır. Misal:
public class DemoClass{
    public synchronized void demoMethod(){}
}
və ya
public class DemoClass{
    public void demoMethod(){
        synchronized (this)        {
            //other thread safe code
        }
    }
}
və ya
public class DemoClass{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Sinif səviyyəli kilidləmə

Sinfin mövcud nümunələrindən hər hansı birində icra zamanı birdən çox mövzunun sinxronlaşdırılmış bloka daxil olmasının qarşısını alır. Bu o deməkdir ki, proqramın icrası zamanı sinifin 100 nümunəsi varsa DemoClass, o zaman hər hansı bir vəziyyətdə yalnız bir iplik icra edə biləcək demoMethod()və bütün digər hallar digər mövzular üçün bloklanacaq. Bu, statik məlumat başlığını təhlükəsiz etmək lazım olduqda lazımdır.
public class DemoClass{
    public synchronized static void demoMethod(){}
}
və ya
public class DemoClass{
    public void demoMethod(){
        synchronized (DemoClass.class)        {
            //other thread safe code
        }
    }
}
və ya
public class DemoClass
{
    private final static Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)        {
            //other thread safe code
        }
    }
}

Bəzi Vacib Qeydlər

  1. Java-da sinxronizasiya heç bir iki başlığın sinxronlaşdırılmış metodu eyni vaxtda və ya paralel olaraq yerinə yetirə bilməməsini təmin edir.

  2. synchronizedyalnız metodlar və kod blokları ilə istifadə edilə bilər. Bu üsullar və ya bloklar statik və ya qeyri-statik ola bilər.

  3. когда Howой либо поток входит в синхронизированный метод or блок он приобретает блокировку и всякий раз, когда поток выходит из синхронизированного метода or блока JVM снимает блокировку. Блокировка снимается, даже если нить оставляет синхронизированный метод после завершения из-за Howих-либо ошибок or исключений.

  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