Sobes.tech
Middle

Java-da əsas sinxronizasiya üsulları hansılardır?

sobes.tech Süni İntellekt

AI-dan cavab

Java-da əsas əsas sinxronizasiya üsulları:

  1. Açar söz synchronized:

    • Metodların və ya kod bloklarının sinxronizasiyası üçün istifadə olunur.
    • synchronized ilə 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--;
            }
        }
    }
    
  2. 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;
        }
    }
    
  3. Açıq kilidləmə blokları (Explicit Locks):

    • synchronized-ə nisbətən daha çevik nəzarət imkanı verir.
    • Lock interfeysi və onun tətbiqləri, məsələn ReentrantLock.
    • Ə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()unlock() çağırışlarını açıq şəkildə etmək tələb olunur. unlock() çağırışını finally blokunda 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");
            }
        }
    }
    
  4. wait(), notify(), notifyAll():

    • Object sinifinin 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-i notify() və ya notifyAll() ç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.