Sobes.tech
Middle

Optimist və pessimist kilidlər nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Optimist və pessimist kilidlər, çoxmərhələli tətbiqlər və verilənlər bazaları kimi mühitlərdə ümumi məlumatlara paralel girişin idarə olunması üçün yanaşmalardır.

Pessimist kilid:

Məlumatlara girişdə mümkün olan münaqişələri qəbul edir. Resursa girişdən əvvəl, iş axını və ya əməliyyat onu kilidləyir (exklusiv və ya paylaşılan). Digər iş axınları ona giriş etməyə çalışarkən, onlar kilid açılana qədər gözləyirlər.

  • Üstünlüklər: Məlumatların bütövlüyünü təmin edir, aşağı rəqabət şəraitində tətbiqi asandır.
  • Çatışmazlıqlar: Kilidləmələrə (gözləmələrə) səbəb ola bilər, yüksək rəqabət şəraitində ötürmə qabiliyyətini azaldır (deadlocklar).
  • Nümunələr: Java-da synchronized açar sözü, verilənlər bazalarında sətir və ya cədvəl səviyyəli kilidlər.
// Pessimist kilidləmə nümunəsi Java-da
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++; // Ob'ekt üzərində kilid, yalnız bir iş axını bu metodu eyni zamanda icra edə bilər
    }

    public synchronized int getCount() {
        return count;
    }
}

Optimist kilid:

Məlumatlara girişdə az ehtimal olunan münaqişələri qəbul edir. Məlumatlara giriş kilid olmadan həyata keçirilir. Dəyişiklikləri yadda saxlamadan əvvəl, məlumatların başqa bir iş axını tərəfindən dəyişdirilmədiyini yoxlayır. Əgər dəyişikliklər olubsa, əməliyyat ləğv edilir və adətən yenidən cəhd edilir (retry).

  • Üstünlüklər: Aşağı rəqabət şəraitində yüksək ötürmə qabiliyyəti, deadlock problemləri yoxdur.
  • Çatışmazlıqlar: Münaqişələr baş verə bilər, yenidən cəhdlər tələb oluna bilər, bu da məntiqi mürəkkəbləşdirir. Uzunmüddətli əməliyyatlar və ya yüksək münaqişə ehtimalı olan vəziyyətlər üçün uyğun deyil.
  • Nümunələr: Compare-And-Swap (CAS) əməliyyatları, verilənlər bazalarında versiya idarəetməsi (məsələn, versiya sütunu və ya zaman damgası istifadə edilərək).
// CAS istifadə edərək optimist kilidləmə nümunəsi (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;

public class AtomicCounter {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        // Atomik şəkildə artırmağa cəhd
        // Əgər dəyər oxuma və yeniləmə arasında dəyişibsə, cəhd təkrarlanacaq
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }
}

Müqayisə:

Xüsusiyyət Pesimist kilid Optimist kilid
Təsəvvür Münaqişələr ehtimal olunur Münaqişələr az ehtimal olunur
Yanaşma Girişə qədər kilid istifadə edilir Kilid olmadan giriş, yazarkən yoxlama
Yüksək rəqabətli mühitdə Bloklamalara səbəb ola bilər, ötürmə qabiliyyətini azaldır Tez-tez yenidən başlatmalar, performansı azaldır
Aşağı rəqabətli mühitdə Overhead yarada bilər Yüksək emal qabiliyyəti
Deadlock problemi Mümkündür Mümkün deyil (resurslara eyni zamanda giriş baxımından)