Middle
Java-da əsas sinxronizasiya üsulları hansılardır?
sobes.tech Süni İntellekt
AI-dan cavab
Java-da əsas əsas sinxronizasiya üsulları:
-
Açar söz
synchronized:- Metodların və ya kod bloklarının sinxronizasiyası üçün istifadə olunur.
synchronizedilə işarələnmiş metod, həmin obyektin digər sinxronlaşdırılmış metodlarına girişə mane olur.synchronized (this): cari obyekt üzərində sinxronizasiya.synchronized (ClassName.class): sinif üzərində sinxronizasiya, bütün threadlərin bu siniflə işləməsinə mane olur.synchronized (object): konkret monitor obyektinə sinxronizasiya.
class Counter { private int count = 0; // Sinxronlaşdırılmış metod public synchronized void increment() { count++; } public void decrement() { // Sinxronlaşdırılmış blok synchronized (this) { count--; } } } -
Açar söz
volatile:- Dəyişənin threadlər arasında dəyişikliklərinin görünməsini təmin edir.
- Kompleks əməliyyatların atomarliyini təmin etmir (məsələn,
i++), yalnız oxuma və yazma. - Sinif sahələrinə tətbiq olunur.
class SharedData { volatile boolean flag = false; public void setFlag(boolean value) { flag = value; // Bayrağın dəyişməsi digər threadlər üçün görünən olur } public boolean getFlag() { return flag; } } -
Açıq kilidləmə blokları (Explicit Locks):
synchronized-ə nisbətən daha çevik nəzarət imkanı verir.Lockinterfeysi və onun tətbiqləri, məsələnReentrantLock.- Ədalətli və ədalətsiz kilidləmə rejimi arasında seçim etmək, kilid vəziyyətini yoxlamaq, kilid gözləyən thread-i dayandırmaq imkanı verir.
lock()vəunlock()çağırışlarını açıq şəkildə etmək tələb olunur.unlock()çağırışınıfinallyblokunda etmək vacibdir.
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class Resource { private final Lock lock = new ReentrantLock(); public void performAction() { lock.lock(); // Kilidi əldə et try { // Kritik bölmə System.out.println(Thread.currentThread().getName() + " kilidi əldə etdi"); Thread.sleep(100); // İşin simulyasiyası } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); // Kilidi azad et System.out.println(Thread.currentThread().getName() + " kilidi azad etdi"); } } } -
wait(),notify(),notifyAll():Objectsinifinin metodları, monitorin azad olunmasını gözləyən threadlər arasında qarşılıqlı əlaqə üçün istifadə olunur.wait(): monitoru azad edir və thread-inotify()və yanotifyAll()çağırılana qədər gözləmə vəziyyətinə keçirir.notify(): bu monitor üzərində gözləyən bir thread-i oyadır.notifyAll(): bu monitor üzərində gözləyən bütün thread-ləri oyadır.- Eyni monitor obyekti üçün sinxronlaşdırılmış blok və ya metod daxilində çağırılmalıdır.
class ProducerConsumer { private final Object monitor = new Object(); private boolean isProduced = false; public void produce() throws InterruptedException { synchronized (monitor) { while (isProduced) { monitor.wait(); // İstehlakçı tərəfindən yeyilməsini gözləyir } // İstehsal System.out.println("İstehsal edildi"); isProduced = true; monitor.notifyAll(); // İstehlakçıları xəbərdar et } } public void consume() throws InterruptedException { synchronized (monitor) { while (!isProduced) { monitor.wait(); // İstehsalçı tərəfindən istehsal olunmasını gözləyir } // İstifadə System.out.println("İstifadə edildi"); isProduced = false; monitor.notifyAll(); // İstehsalçıları xəbərdar et } } }
Bu mexanizmlər Java-da təhlükəsiz çox threadli kod yaratmaq üçün əsasdır. Konkret metodun seçimi vəzifənin xüsusiyyətlərinə və sinxronizasiyaya nəzarət səviyyəsinə bağlıdır.