0Pricing
Java Academy · Ders

StampedLock ve İyimser Okumalar

Okumaların ağırlıklı olduğu, yüksek aktarım hızlı iş yüklerinde StampedLock'ın iyimser okuma kipini uygulayın.

StampedLock ve İyimser Okumalar, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. 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.

StampedLock Nedir

Java 8'de kullanıma sunulan StampedLock, ReadWriteLock kavramlarını ek bir iyimser okuma moduyla genişletir. İşlemler, kilidi serbest bırakmak veya iyimser okumayı doğrulamak için kullanılan uzun bir damga döndürür.

import java.util.concurrent.locks.*;

StampedLock sl = new StampedLock();

// Exclusive write:
long stamp = sl.writeLock();
try {
    // write data
} finally {
    sl.unlockWrite(stamp);
}

// Shared read:
stamp = sl.readLock();
try {
    // read data
} finally {
    sl.unlockRead(stamp);
}

İyimser Okuma Modu

İyimser okuma kilit edinmez — yalnızca bir damga alır. Okumadan sonra damgayı doğrulayın. Doğrulama başarısız olursa (bir yazıcı araya girdiyse) gerçek bir okuma kilidine geri dönün:

StampedLock sl2 = new StampedLock();
double x = 0, y = 0;

// Try optimistic read first:
long stamp = sl2.tryOptimisticRead();
double localX = x, localY = y; // read values

if (!sl2.validate(stamp)) {
    // A write occurred — fall back to read lock
    stamp = sl2.readLock();
    try {
        localX = x;
        localY = y;
    } finally {
        sl2.unlockRead(stamp);
    }
}
// use localX and localY

Tam Point2D Örneği

Klasik StampedLock örneği — iyimser okumalar içeren 2B bir nokta:

class Point {
    private double x, y;
    private final StampedLock lock = new StampedLock();
    
    void move(double dx, double dy) {
        long stamp = lock.writeLock();
        try { x += dx; y += dy; }
        finally { lock.unlockWrite(stamp); }
    }
    
    double distanceFromOrigin() {
        long stamp = lock.tryOptimisticRead();
        double cx = x, cy = y;
        if (!lock.validate(stamp)) {
            stamp = lock.readLock();
            try { cx = x; cy = y; }
            finally { lock.unlockRead(stamp); }
        }
        return Math.sqrt(cx * cx + cy * cy);
    }
}

Kilit Dönüştürme

StampedLock, kilit modları arasında dönüştürmeyi destekler:

StampedLock sl3 = new StampedLock();

// Read → Write upgrade attempt:
long readStamp = sl3.readLock();
long writeStamp = sl3.tryConvertToWriteLock(readStamp);
if (writeStamp != 0) {
    // Successfully upgraded!
    // ... write ...
    sl3.unlockWrite(writeStamp);
} else {
    // Upgrade failed — release read and reacquire write
    sl3.unlockRead(readStamp);
    writeStamp = sl3.writeLock();
    // ... write ...
    sl3.unlockWrite(writeStamp);
}

İyimser Okumalar En Çok Ne Zaman Faydalıdır

İyimser okumalar şu durumlarda özellikle etkilidir:

  • Okumalar yazmalardan çok daha sık yapılıyorsa
  • Veri anlık görüntüsü birkaç yerel değişkene sığıyorsa (nesne ayrımı yapılmıyorsa)
  • Yazma çekişmesi düşükse (doğrulama nadiren başarısız oluyorsa)

Yazmalar sık olduğunda iyimser okumalar tekrar tekrar tam okuma kilitlerine geri döner ve herhangi bir fayda sağlamaz.

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

Temel farklar:

  • StampedLock: iyimser okumalar ekler; yeniden girilebilir DEĞİLDİR; Condition desteği yoktur
  • ReentrantReadWriteLock: yeniden girilebilirdir; Condition'ları destekler; iyimser modu yoktur

StampedLock, yazma çekişmesinin düşük olduğu durumlarda daha hızlıdır. ReentrantReadWriteLock daha güvenli ve daha zengin özelliklere sahiptir.

StampedLock Yeniden Girilebilir DEĞİLDİR

ReentrantLock'un aksine StampedLock yeniden girilebilir DEĞİLDİR. Zaten tuttuğu bir modu edinmeye çalışan iş parçacığı kilitlenir:

StampedLock sl4 = new StampedLock();
long s1 = sl4.readLock();
// DO NOT: sl4.readLock() again — deadlocks with non-reentrant!

tryWriteLock ve tryReadLock

Engellemeden kilit edinme denemeleri başarısız olursa 0 döndürür:

StampedLock sl5 = new StampedLock();

long stamp = sl5.tryWriteLock();
if (stamp != 0) {
    try {
        System.out.println("Got write lock");
    } finally {
        sl5.unlockWrite(stamp);
    }
} else {
    System.out.println("Write lock unavailable");
}

ReadWriteLock Olarak Kullanma

StampedLock, uyumluluk için standart bir ReadWriteLock görünümü döndürebilir:

StampedLock sl6 = new StampedLock();
Lock readLock  = sl6.asReadLock();
Lock writeLock = sl6.asWriteLock();
ReadWriteLock rwView = sl6.asReadWriteLock();
// These provide standard Lock interface without optimistic mode

Performans Karşılaştırması Sezgisi

Karşılaştırma sonuçları genellikle şunları gösterir:

  • Okumaların çok ağırlıkta olduğu durum (%99 okuma): StampedLock > ReadWriteLock > synchronized
  • Karma iş yükü (%70 okuma): ReadWriteLock ≈ StampedLock
  • Yazmaların ağırlıkta olduğu durum: synchronized veya ReentrantLock çoğu zaman kazanır (daha düşük ek yük)

Eniyileme yapmadan önce her zaman gerçekçi iş yükleriyle profil oluşturun.

Kilidi Açtıktan Sonra Damganın Geçersizliği

Bir kilidi damgayla serbest bıraktıktan sonra bu damga geçersiz hale gelir. Kilidi açtıktan sonra eski bir damganın kullanılması tanımsız davranışa yol açar — her kilit edinme işlemi için her zaman yeni bir damga alın.

StampedLock sl7 = new StampedLock();
long stamp = sl7.writeLock();
sl7.unlockWrite(stamp);
// stamp is now invalid — don't use it:
// sl7.unlockWrite(stamp); // throws IllegalMonitorStateException or corrupts state

Hızlı Kontrol

tryOptimisticRead() ile yapılan iyimser okuma ve ardından gelen validate(stamp) çağrısı false döndürüyor. Kod bundan sonra ne yapmalıdır?

Özet: StampedLock

Temel çıkarımlar:

  • Üç mod: iyimser okuma (kilit yok), okuma kilidi ve yazma kilidi
  • tryOptimisticRead() + validate() — sıfır maliyetli okuma denemesi
  • Doğrulama başarısız olduğunda → readLock()'a geri dönün
  • Yeniden girilebilir DEĞİLDİR — aynı iş parçacığı yeniden edinmeye çalışırsa kilitlenme riski vardır
  • Condition desteği yoktur — gerektiğinde ReentrantReadWriteLock kullanın

Sıkça Sorulan Sorular

“StampedLock ve İyimser Okumalar” dersi ücretsiz mi?

Evet — “StampedLock ve İyimser Okumalar” 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.

“StampedLock ve İyimser Okumalar” dersinde ne öğreneceğim?

Okumaların ağırlıklı olduğu, yüksek aktarım hızlı iş yüklerinde StampedLock'ın iyimser okuma kipini uygulayı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 4. dersidir.

“StampedLock ve İyimser Okumalar” 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