Java dilində 'synchronized' sinxronizasiya mexanizmi necə işləyir?
sobes.tech Süni İntellekt
AI-dan cavab
Java'da synchronized mexanizmi monitorlar (monitor obyektləri) konseptinə əsaslanır. Java'da hər bir obyektə monitor təyin edilir.
Bir iş parçacığı (thread) sinxronlaşdırılmış blok və ya metoda daxil olduqda, müvafiq obyektin monitorunu əldə etməyə çalışır. Əgər monitor boşdursa, iş parçacığı onu əldə edir və icraata davam edir. Əgər monitor başqa bir iş parçacığı tərəfindən tutulursa, cari iş parçacığı bloklanır və gözləmə vəziyyətinə keçir, monitor sərbəst buraxılana qədər.
Monitor daxilində aşağıdakı mexanizmlər həyata keçirilir:
- Mübadiləsiz çıxış (Mutual Exclusion): Yalnız bir iş parçacığı bir vaxtda obyektin monitorunu əldə edə bilər. Bu, yalnız bir iş parçacığının bu obyekt üçün sinxronlaşdırılmış kodu icra etməsini təmin edir.
- Gözləmə və bildiriş (Waiting and Notification): Monitor
wait(),notify()vənotifyAll()metodlarını ehtiva edir. Bu metodlar monitoru əldə edən iş parçacıqlarına onu müvəqqəti olaraq sərbəst buraxmağa və gözləmə vəziyyətinə keçməyə imkan verir, daha sonra digər iş parçacqları tərəfindən davam etmə imkanı üçün xəbərdar edilir.
Aşağı səviyyəli tətbiq aşağıdakı kimi həyata keçirilir:
monitorenterəmri: Sinxronlaşdırılmış blok və ya metoda daxil olarkən icra olunur. Obyektin monitorunu əldə etməyə çalışır.monitorexitəmri: Sinxronlaşdırılmış blok və ya metoddan çıxarkən icra olunur (normal tamamlanma və ya istisna ilə). Obyektin monitorunu sərbəst buraxır.
Bu əmrlər Java bayt-kodunun bir hissəsidir və Java Virtual Machine (JVM) tərəfindən idarə olunur. JVM monitorların idarə olunması və iş parçacıklarının kilidlənməsi/azad olunması üçün yerli əməliyyat sistemi mexanizmlərindən (mutexlər, semaforlar) istifadə edir.
Monitorun əldə olunması obyekt səviyyəsində (nümunə metodlar və bloklar üçün) və ya sinif səviyyəsində (statik metodlar və bloklar üçün) həyata keçirilə bilər və Class obyektindən kilid kimi istifadə edilir.
İstifadə nümunəsi:
public class Counter {
private int count = 0;
public synchronized void increment() { // Sinxronlaşdırılmış metod
count++;
}
public void decrement() {
synchronized (this) { // Sinxronlaşdırılmış blok
count--;
}
}
public static synchronized void staticMethod() { // Statik sinxronlaşdırılmış metod
// ...
}
}
Monitorlarla əlaqəli Object sinifinin metodları cədvəli:
| Metod | Təsviri |
|---|---|
wait() |
Monitoru əldə edən iş parçacığı onu müvəqqəti olaraq sərbəst buraxır və gözləmə vəziyyətinə keçir. |
notify() |
Gözləyən iş parçacığından birinə xəbərdarlıq edir ki, o monitoru əldə edə və işləməyə davam edə bilər. |
notifyAll() |
Bütün gözləyən iş parçacıqlarına xəbərdarlıq edir. |