0Pricing
Java Academy · Pelajaran

StampedLock dan Pembacaan Optimistis

Terapkan mode pembacaan optimistis StampedLock untuk beban kerja berthroughput tinggi yang didominasi pembacaan.

StampedLock dan Pembacaan Optimistis adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Apa Itu StampedLock?

Diperkenalkan pada Java 8, StampedLock memperluas konsep ReadWriteLock dengan mode tambahan berupa pembacaan optimistis. Operasi mengembalikan nilai long berupa stempel yang digunakan untuk melepaskan lock atau memvalidasi pembacaan optimistis.

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);
}

Mode Pembacaan Optimistis

Pembacaan optimistis tidak memperoleh lock — hanya mendapatkan stempel. Setelah membaca, validasi stempel tersebut. Jika validasi gagal (penulis menyela), gunakan lock baca sungguhan sebagai pengganti:

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

Contoh Lengkap Point2D

Contoh klasik StampedLock — titik 2D dengan pembacaan optimistis:

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);
    }
}

Konversi Lock

StampedLock mendukung konversi antarmode lock:

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);
}

Kapan Pembacaan Optimistis Paling Membantu

Pembacaan optimistis sangat bermanfaat ketika:

  • Pembacaan jauh lebih sering daripada penulisan
  • Potret data dapat dimuat dalam beberapa variabel lokal (tanpa alokasi objek)
  • Persaingan penulisan rendah (validasi jarang gagal)

Jika penulisan sering dilakukan, pembacaan optimistis berulang kali beralih ke lock baca penuh — sehingga tidak memberikan manfaat.

StampedLock vs ReadWriteLock

Perbedaan utama:

  • StampedLock: menambahkan pembacaan optimistis; NOT reentrant; tidak mendukung kondisi
  • ReentrantReadWriteLock: reentrant; mendukung kondisi; tidak memiliki mode optimistis

StampedLock lebih cepat saat persaingan penulisan rendah. ReentrantReadWriteLock lebih aman dan memiliki lebih banyak fitur.

StampedLock TIDAK Reentrant

Berbeda dari ReentrantLock, StampedLock tidak bersifat reentrant. Utas yang mencoba memperoleh mode yang sudah dipegangnya akan mengalami kebuntuan:

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

tryWriteLock dan tryReadLock

Upaya memperoleh lock tanpa pemblokiran mengembalikan 0 jika tidak berhasil:

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");
}

Menggunakan sebagai ReadWriteLock

StampedLock dapat mengembalikan tampilan sebagai ReadWriteLock standar untuk kompatibilitas:

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

Intuisi Tolok Ukur Performa

Hasil tolok ukur biasanya menunjukkan:

  • Sangat didominasi pembacaan (99% pembacaan): StampedLock > ReadWriteLock > sinkronisasi
  • Beban kerja campuran (70% pembacaan): ReadWriteLock ≈ StampedLock
  • Didominasi penulisan: sinkronisasi atau ReentrantLock sering kali unggul (overhead lebih rendah)

Selalu lakukan pembuatan profil dengan beban kerja yang realistis sebelum mengoptimalkan.

Ketidakvalidan Stempel Setelah Membuka Lock

Setelah melepaskan lock dengan stempel, stempel tersebut menjadi tidak valid. Menggunakan stempel lama setelah membuka lock menyebabkan perilaku tak terdefinisi — selalu ambil stempel baru untuk setiap akuisisi lock.

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

Pemeriksaan Singkat

Pembacaan optimistis dengan tryOptimisticRead() dan kemudian validate(stamp) mengembalikan nilai salah. Apa yang harus dilakukan kode selanjutnya?

Ringkasan: StampedLock

Inti pembelajaran:

  • Tiga mode: pembacaan optimistis (tanpa lock), lock baca, dan lock tulis
  • tryOptimisticRead() + validate() — percobaan pembacaan tanpa biaya
  • Saat validasi gagal → gunakan readLock()
  • NOT reentrant — berisiko mengalami kebuntuan jika utas yang sama memperoleh lock lagi
  • Tidak ada dukungan kondisi — gunakan ReentrantReadWriteLock jika diperlukan

Pertanyaan yang Sering Diajukan

Apakah pelajaran “StampedLock dan Pembacaan Optimistis” gratis?

Ya — teks lengkap “StampedLock dan Pembacaan Optimistis” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “StampedLock dan Pembacaan Optimistis”?

Terapkan mode pembacaan optimistis StampedLock untuk beban kerja berthroughput tinggi yang didominasi pembacaan. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “StampedLock dan Pembacaan Optimistis” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. ReentrantLock vs synchronized
  2. ReadWriteLock untuk Skenario Pembaca-Penulis
  3. Variabel Atomik: Pembaruan Tanpa Lock
  4. StampedLock dan Pembacaan Optimistis
← Kembali ke Java Academy