CodeBlanks Logo Icon CodeBlanks

Lock ve Condition

Lock ve Condition ile esnek kilidi öğrenirsin.

Lock ve Condition

Lock arayüzü, synchronized'den daha esnek kilitleme sağlar. ReentrantLock en yaygın uygulamasıdır; lock() ile kilitlenir, unlock() ile bırakılır.

Lock lock = new ReentrantLock();
lock.lock();
try {
    // kritik bölge
} finally {
    lock.unlock();
}

finally bloğu kilidin her zaman bırakılmasını sağlar. tryLock() kilit boşsa true döner; bu, özellikle kilitlenmelerden kaçınmak için yararlıdır. Condition ile await/signal yöntemleri de kullanılabilir.

ReentrantLock özellikleri

ReentrantLock, aynı iş parçacığının kilidi birden çok kez almasına izin verir. Her lock() çağrısı için bir unlock() gerekir; bu sayede iç içe çağrılar güvenli çalışır.

lock.lock();
lock.lock();  // aynı iş parçacığı, OK
// ...
lock.unlock();
lock.unlock();

fairness parametresi ile uzun bekleyene öncelik verilebilir: new ReentrantLock(true). Bu, açlık problemini azaltır. Lock, synchronized'den farklı olarak zaman aşımı ile denenebilir.

Uygulama ReentrantLock ile sayaç

Bir LockCounter sınıfı tanımla; private int count = 0 ve private final Lock lock = new ReentrantLock() alanları olsun. public void inc() yöntemi lock.lock() çağırıp try { count++; } finally { lock.unlock(); } yapsın. public int get() yöntemi count döndürsün. Bir LockDemo sınıfında main yaz; inc() üç kez çağır ve get() sonucunu yazdır.

Başlangıç kodu

Main.java
import java.util.concurrent.locks.*;

// LockCounter sınıfını tanımla (count, lock, inc, get)

// LockDemo sınıfında main yaz; inc'i üç kez çağır ve get sonucunu yazdır

Örnek çözüm

Main.java
import java.util.concurrent.locks.*;

class LockCounter {
    private int count = 0;
    private final Lock lock = new ReentrantLock();
    public void inc() {
        lock.lock();
        try { count++; } finally { lock.unlock(); }
    }
    public int get() { return count; }
}

class LockDemo {
    public static void main(String[] args) {
        LockCounter c = new LockCounter();
        c.inc();
        c.inc();
        c.inc();
        System.out.println(c.get());
    }
}

Beklenen çıktı

3

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Lock kilit açma çağrısını tamamla

Soru
Lock lock = new ReentrantLock();
lock.lock();
try {
    count++;
} finally {
    lock.____();
}
Cevap
Lock lock = new ReentrantLock();
lock.lock();
try {
    count++;
} finally {
    lock.unlock();
}

Açıklama: unlock() kilidi bırakır.

2 Lock kullanırken unlock() nereye yazılır?

  • finally bloğuna Doğru cevap
  • try bloğunun içine
  • catch bloğuna
  • main dışına

Açıklama: finally bloğu kilidin her durumda bırakılmasını sağlar.

3 Lock kavramlarını eşleştir

Kavram Anlamı
ReentrantLock En yaygın Lock uygulaması
tryLock Boşsa true döner
Condition await/signal sağlar
fairness Uzun bekleyene öncelik

İleri seviye bölümündeki tüm dersler