Sobes.tech
Middle

Optimistik va pessimistik bloklar nima?

sobes.tech AI

AIdan javob

Optimistik va pessimistik bloklar — bu raqobat muhitlarida (ko'p ipli ilovalar, ma'lumotlar bazalari) umumiy ma'lumotlarga parallel kirishni boshqarish yondashuvlari.

Pessimistik blokirovka:

Ma'lumotlarga kirishda mumkin bo'lgan nizolarni faraz qiladi. Resursga kirishdan oldin, oqim yoki tranzaksiya uni bloklaydi (eksklyuziv yoki umumiy). Boshqa oqimlar unga kirishga harakat qilganda, ular blok ochilguncha kutishadi.

  • Afzalliklar: Ma'lumotlarning yaxlitligini ta'minlaydi, kam raqobat sharoitida amalga oshirish oson.
  • Kamchiliklar: Blokirovka (kutish)ga olib kelishi mumkin, yuqori raqobatda o'tkazuvchanlikni kamaytiradi (deadlocklar).
  • Misollar: Java'da synchronized kalit so'zi, ma'lumotlar bazalarida satr yoki jadval darajasidagi bloklar.
// Java'da pessimist blokirovka misoli
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++; // Ob'ekt bo'yicha blokirovka, faqat bitta oqim bu metodni bajarishi mumkin
    }

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

Optimistik blokirovka:

Ma'lumotlarga kirishda kam ehtimol bilan nizolar yuzaga keladi deb faraz qiladi. Ma'lumotlarga kirish bloklarsiz amalga oshiriladi. O'zgarishlarni saqlashdan oldin, ma'lumotlar boshqa oqim tomonidan o'qilganidan beri o'zgartirilmaganligini tekshiradi. Agar o'zgartirishlar bo'lsa, operatsiya bekor qilinadi va odatda qayta uriniladi (retry).

  • Afzalliklar: Kam raqobat sharoitida yuqori o'tkazuvchanlik, deadlock muammosi yo'q.
  • Kamchiliklar: Nizolar yuzaga kelishi mumkin, takrorlashlar talab qilinadi, bu mantiqni murakkablashtiradi. Uzoq davom etadigan yoki yuqori ehtimollikdagi nizolar uchun mos emas.
  • Misollar: Compare-And-Swap (CAS) operatsiyalari, ma'lumotlar bazalarida versiya boshqaruvi (masalan, versiya ustunidan yoki vaqt markazidan foydalanish).
// CAS yordamida optimistik blokirovka misoli (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;

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

    public void increment() {
        // Atomik tarzda oshirishga urinish
        // Agar qiymat o'qish va yangilash orasida o'zgargan bo'lsa, urinish takrorlanadi
        count.incrementAndGet();
    }

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

Taqqoslash:

Xususiyat Pessimistik blokirovka Optimistik blokirovka
Faraz Nizolar ehtimoliy Nizolar kam ehtimoliy
Yondashuv Kirishdan oldin blokirovka qilinadi Blokirovsiz kirish, yozishda tekshirish
Yuqori raqobat sharoitida Blokirovka yuzaga kelishi, o'tkazuvchanlikni kamaytirishi mumkin Tez-tez takrorlashlar, ishlashni kamaytiradi
Past raqobat sharoitida Overhead yaratishi mumkin Yuqori o'tkazuvchanlik
Deadlock muammosi Mümkin Mümkin emas (resurslarga bir vaqtning o'zida kirish nuqtai nazaridan)