İyimser ve kötümser kilitler nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
İyimser ve kötümser kilitler, eşzamanlı ortamlar (çok iş parçacıklı uygulamalar, veritabanları) içinde ortak verilere paralel erişimi yönetmek için yaklaşımlardır.
Kötümser kilitleme:
Verilere erişimde olasılık dahilinde çatışmalar olduğunu varsayar. Bir kaynağa erişmeden önce, iş parçacığı veya işlem onu kilitler (özel veya paylaşılan). Diğer iş parçacıkları, erişmeye çalıştıklarında, kilit serbest bırakılana kadar beklerler.
- Avantajlar: Verilerin bütünlüğünü sağlar, düşük rekabet durumlarında uygulanması basittir.
- Dezavantajlar: Kilitlenmelere (beklemelere) neden olabilir, yüksek rekabet durumlarında verimliliği azaltabilir (deadlock).
- Örnekler: Java'da
synchronizedanahtar kelimesi, veritabanlarındaki satır veya tablo seviyesinde kilitler.
// Java'da kötümser kilitleme örneği
public class Counter {
private int count = 0;
public synchronized void increment() {
count++; // Nesne üzerinde kilit, aynı anda sadece bir iş parçacığı bu yöntemi çalıştırabilir
}
public synchronized int getCount() {
return count;
}
}
İyimser kilitleme:
Verilere erişimde olasılık dahilinde çatışmaların düşük olduğunu varsayar. Verilere erişim, kilit kullanmadan yapılır. Değişiklikler kaydedilmeden önce, verilerin başka bir iş parçacığı tarafından değiştirilip değiştirilmediği kontrol edilir. Değişiklikler varsa, işlem iptal edilir ve genellikle tekrar denenir (retry).
- Avantajlar: Düşük rekabet durumlarında yüksek işlem kapasitesi, deadlock sorunu yoktur.
- Dezavantajlar: Çatışmalar ortaya çıkabilir, tekrar denemeleri gerektirebilir, bu da mantığı karmaşıklaştırır. Uzun süren işlemler veya yüksek çatışma olasılığı olan durumlar için uygun değildir.
- Örnekler: Compare-And-Swap (CAS) işlemleri, veritabanlarındaki sürüm yönetimi (örneğin, sürüm sütunu veya zaman damgası kullanımı).
// CAS kullanarak iyimser kilitleme örneği (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicCounter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
// Atomik olarak artırma girişimi
// Değer, okuma ve güncelleme arasında değişmişse, tekrar denenecek
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
Karşılaştırma:
| Özellik | Kötümser kilitleme | İyimser kilitleme |
|---|---|---|
| Varsayım | Çatışmalar olasıdır | Çatışmalar düşük olasıdır |
| Yaklaşım | Erişim sırasında kilit kullanılır | Kilit kullanmadan erişim, yazarken kontrol |
| Yüksek rekabet durumunda | Kilitlenmelere neden olabilir, verimliliği azaltır | Sık yeniden başlatmalar, performansı düşürür |
| Düşük rekabet durumunda | Overhead oluşturabilir | Yüksek işlem kapasitesi |
| Deadlock sorunu | Mümkün | Mümkün değil (kaynaklara eşzamanlı erişim açısından) |