0Pricing
Java Academy · Ders

Okuyucu-Yazıcı Senaryoları için ReadWriteLock

Bir önbellekte özel yazma erişimini güvence altına alırken eşzamanlı okumalara izin vermek için ReadWriteLock kullanın.

Okuyucu-Yazıcı Senaryoları için ReadWriteLock, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Okuyucu-Yazıcı Problemi

Birden çok iş parçacığı paylaşılan verileri aynı anda güvenli bir şekilde okuyabilir. Ancak yazma işlemi özel erişim gerektirir — eş zamanlı okuma veya yazma yapılamaz. Bir ReadWriteLock bunu modeller: birden çok eş zamanlı okuyucu VEYA tek bir özel yazıcı.

import java.util.concurrent.locks.*;

ReadWriteLock rwLock = new ReentrantReadWriteLock();
Lock readLock  = rwLock.readLock();
Lock writeLock = rwLock.writeLock();

Okuma Kilidi: Paylaşılan Erişim

Hiçbir iş parçacığı yazma kilidini tutmadığı sürece birden çok iş parçacığı okuma kilidini aynı anda tutabilir:

class ReadableCache {
    private final Map<String, String> cache = new HashMap<>();
    private final ReadWriteLock lock = new ReentrantReadWriteLock();
    
    String get(String key) {
        lock.readLock().lock();
        try {
            return cache.get(key); // concurrent reads OK
        } finally {
            lock.readLock().unlock();
        }
    }
}

Yazma Kilidi: Özel Erişim

Aynı anda yalnızca bir iş parçacığı yazma kilidini tutabilir. Yazma sırasında tüm okuyucular ve diğer yazıcılar engellenir:

class WritableCache extends ReadableCache {
    private final ReadWriteLock wLock = new ReentrantReadWriteLock();
    private final Map<String, String> data = new HashMap<>();
    
    void put(String key, String value) {
        wLock.writeLock().lock();
        try {
            data.put(key, value); // exclusive write
        } finally {
            wLock.writeLock().unlock();
        }
    }
}

Tam Önbellek Örneği

Okumaların çoğunlukta, yazmaların ise nadir olduğu iş parçacığı güvenli bir önbellek:

class Cache<K,V> {
    private final Map<K,V> map = new HashMap<>();
    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    
    V get(K key) {
        lock.readLock().lock();
        try { return map.get(key); }
        finally { lock.readLock().unlock(); }
    }
    
    void put(K key, V value) {
        lock.writeLock().lock();
        try { map.put(key, value); }
        finally { lock.writeLock().unlock(); }
    }
    
    int size() {
        lock.readLock().lock();
        try { return map.size(); }
        finally { lock.readLock().unlock(); }
    }
}

Kilit Derecesini Düşürme

ReadWriteLock, kilit derecesini düşürmeyi destekler: yazma kilidini edin → okuma kilidini edin → yazma kilidini serbest bırak. Bu, bir iş parçacığının kilidi serbest bırakmadan özel yazma erişiminden paylaşılan okuma erişimine geçmesini sağlar:

ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
Lock r = rwl.readLock(), w = rwl.writeLock();

w.lock(); // acquire write
try {
    // modify data
    r.lock(); // acquire read WHILE holding write
} finally {
    w.unlock(); // release write, now holding read only
}
try {
    // safely read the just-written data
} finally {
    r.unlock();
}

Okuma Kilidi Yükseltilemez

Kilit yükseltme (okumadan yazmaya) desteklenmez. Okuma kilidini tutan bir iş parçacığı yazma kilidini edinmeye çalışırsa kilitlenme oluşur; çünkü yazma kilidi, kendisi de dahil olmak üzere TÜM okuyucuları bekler:

// DEADLOCK: Do NOT do this
lock.readLock().lock();
try {
    lock.writeLock().lock(); // DEADLOCK — waits for readLock to release
} finally {
    lock.readLock().unlock();
}

ReadWriteLock Ne Zaman Faydalıdır

ReadWriteLock şu durumlarda faydalıdır:

  • Okumalar yazmalardan çok daha fazlaysa
  • Okuma işlemleri önemsiz olmayan bir süre alıyorsa (örneğin karmaşık sorgular)

Yazmalar sık olduğunda (yazma kilidi tüm okuyucuları engeller) veya işlemler çok hızlı olduğunda (iki kilit nesnesinin ek yükü nedeniyle) performansı düşürebilir.

ReadWriteLock ile synchronized Karşılaştırması

synchronized/ReentrantLock → aynı anda yalnızca bir iş parçacığı (eş zamanlı okuyucular bile engellenir).
ReadWriteLock → birden çok eş zamanlı okuyucu ve özel bir yazıcı. Okumaların ağırlıkta olduğu senaryolarda daha iyi okuma aktarım hızı sağlar.

// synchronized: only one thread reads at a time
synchronized String get(String key) { return cache.get(key); }

// ReadWriteLock: many threads can read simultaneously
String get2(String key) {
    lock.readLock().lock();
    try { return cache.get(key); }
    finally { lock.readLock().unlock(); }
}

Performansla İlgili Hususlar

İki kilit nesnesini edinip serbest bırakmak, tek bir kilide kıyasla ek yük getirir. ReadWriteLock'un daha hızlı olduğunu varsaymadan önce profil oluşturun. Uzun işlemlerin bulunduğu, okumaların ağırlıkta olduğu senaryolarda fayda açıktır. Hızlı ve yazmaların ağırlıkta olduğu iş yüklerinde basit bir ReentrantLock daha hızlı olabilir.

ConcurrentHashMap Alternatifi

Basit eşlem işlemleri için ConcurrentHashMap, genellikle HashMap + ReadWriteLock birleşiminden daha hızlıdır; çünkü genel bir çekişme olmadan dahili bölüm düzeyinde kilitler kullanır:

// Often better than HashMap + ReadWriteLock for simple operations:
Map<String, String> concurrent = new ConcurrentHashMap<>();
concurrent.put("key", "value"); // thread-safe, no explicit lock
String v = concurrent.get("key"); // thread-safe

Okuma Kilidinde Adillik

Varsayılan olarak ReentrantReadWriteLock adil değildir (okuyucular yazıcıların aç kalmasına neden olabilir). Yazıcıların aç kalmasını önlemek için adil oluşturucuyu kullanın:

// Fair: waiting writers are served before new readers
ReentrantReadWriteLock fairLock = new ReentrantReadWriteLock(true);
System.out.println(fairLock.isFair()); // true

Hızlı Kontrol

Okumaların ağırlıkta olduğu bir uygulamada ReadWriteLock'un basit bir synchronized yönteme göre temel avantajı nedir?

Özet: ReadWriteLock

Temel çıkarımlar:

  • Birden çok eş zamanlı okuma VEYA tek bir özel yazma — ikisi birden değil
  • Paylaşılan okumalar için readLock.lock()/unlock()
  • Özel yazmalar için writeLock.lock()/unlock()
  • Kilit derecesini düşürme desteklenir; yükseltme (okumadan yazmaya) kilitlenmeye neden olur
  • Önemsiz olmayan işlemlerin bulunduğu, okumaların ağırlıkta olduğu durumlar için idealdir; basit eşlemeler için ConcurrentHashMap kullanın

Sıkça Sorulan Sorular

“Okuyucu-Yazıcı Senaryoları için ReadWriteLock” dersi ücretsiz mi?

Evet — “Okuyucu-Yazıcı Senaryoları için ReadWriteLock” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Okuyucu-Yazıcı Senaryoları için ReadWriteLock” dersinde ne öğreneceğim?

Bir önbellekte özel yazma erişimini güvence altına alırken eşzamanlı okumalara izin vermek için ReadWriteLock kullanın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Okuyucu-Yazıcı Senaryoları için ReadWriteLock” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. ReentrantLock ve synchronized Karşılaştırması
  2. Okuyucu-Yazıcı Senaryoları için ReadWriteLock
  3. Atomik Değişkenler: Kilitsiz Güncellemeler
  4. StampedLock ve İyimser Okumalar
← Java Academy Sayfasına Dön