Java
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.
Örnek çözümü göster
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());
}
}
Kendini test et
-
Lock kilit açma çağrısını tamamla
Lock lock = new ReentrantLock();
lock.lock();
try {
count++;
} finally {
lock.____();
}
Cevabı göster
Lock lock = new ReentrantLock();
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
-
Lock kullanırken unlock() nereye yazılır?
- finally bloğuna
- try bloğunun içine
- catch bloğuna
- main dışına
Cevabı göster
finally bloğuna — finally bloğu kilidin her durumda bırakılmasını sağlar.
-
Lock kavramlarını eşleştir
- ReentrantLock
- En yaygın Lock uygulaması
- tryLock
- Boşsa true döner
- Condition
- await/signal sağlar
- fairness
- Uzun bekleyene öncelik
Sıradaki ders: Özet - Concurrent API