0Pricing
Java Academy · Lección

StampedLock y lecturas optimistas

Aplique el modo de lectura optimista de StampedLock en cargas de trabajo de alto rendimiento dominadas por lecturas.

StampedLock y lecturas optimistas es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

¿Qué es StampedLock?

Introducido en Java 8, StampedLock amplía los conceptos de ReadWriteLock con un modo adicional de lectura optimista. Las operaciones devuelven un sello long que se utiliza para liberar el bloqueo o validar la lectura optimista.

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

Modo de lectura optimista

La lectura optimista no adquiere ningún bloqueo; solo obtiene un sello. Después de leer, valide el sello. Si la validación falla (un escritor intervino), recurra a un bloqueo de lectura real:

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

Ejemplo completo con Point2D

Ejemplo clásico de StampedLock: un punto 2D con lecturas optimistas:

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

Conversión de bloqueos

StampedLock permite convertir entre modos de bloqueo:

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

Cuándo resultan más útiles las lecturas optimistas

Las lecturas optimistas son especialmente útiles cuando:

  • Las lecturas son mucho más frecuentes que las escrituras
  • La instantánea de los datos cabe en unas pocas variables locales (sin asignar objetos)
  • La contención de escritura es baja (la validación falla pocas veces)

Si las escrituras son frecuentes, las lecturas optimistas recurren repetidamente a bloqueos de lectura completos y no ofrecen ningún beneficio.

StampedLock frente a ReadWriteLock

Diferencias principales:

  • StampedLock: añade lecturas optimistas; NO permite la reentrada; no admite Condition
  • ReentrantReadWriteLock: permite la reentrada; admite Conditions; no tiene modo optimista

StampedLock es más rápido cuando la contención de escritura es baja. ReentrantReadWriteLock es más seguro y ofrece más funciones.

StampedLock NO permite la reentrada

A diferencia de ReentrantLock, StampedLock NO permite la reentrada. Un subproceso que intenta adquirir un modo que ya posee sufrirá un interbloqueo:

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

tryWriteLock y tryReadLock

Los intentos de adquisición no bloqueantes devuelven 0 si no tienen éxito:

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

Uso como ReadWriteLock

StampedLock puede devolver una vista como ReadWriteLock estándar para ofrecer compatibilidad:

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

Intuición sobre las pruebas de rendimiento

Los resultados de las pruebas suelen mostrar:

  • Cargas con predominio de lecturas (99 % de lecturas): StampedLock > ReadWriteLock > synchronized
  • Carga mixta (70 % de lecturas): ReadWriteLock ≈ StampedLock
  • Cargas con predominio de escrituras: synchronized o ReentrantLock suelen ganar (menor sobrecarga)

Perfile siempre el código con cargas de trabajo realistas antes de optimizar.

Invalidez del sello después de desbloquear

Después de liberar un bloqueo con un sello, ese sello deja de ser válido. Usar un sello antiguo después de desbloquear provoca un comportamiento indefinido; capture siempre un sello nuevo en cada adquisición del bloqueo.

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

Comprobación rápida

Una lectura optimista con tryOptimisticRead() y una posterior validate(stamp) devuelve false. ¿Qué debe hacer el código a continuación?

Resumen: StampedLock

Conceptos clave:

  • Tres modos: lectura optimista (sin bloqueo), bloqueo de lectura y bloqueo de escritura
  • tryOptimisticRead() + validate(): intento de lectura sin coste
  • Si falla la validación → recurra a readLock()
  • NO permite la reentrada; existe riesgo de interbloqueo si el mismo subproceso vuelve a adquirir el bloqueo
  • No admite Condition; use ReentrantReadWriteLock cuando lo necesite

Preguntas frecuentes

¿La lección «StampedLock y lecturas optimistas» es gratis?

Sí — el texto completo de «StampedLock y lecturas optimistas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «StampedLock y lecturas optimistas»?

Aplique el modo de lectura optimista de StampedLock en cargas de trabajo de alto rendimiento dominadas por lecturas. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «StampedLock y lecturas optimistas»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. ReentrantLock frente a synchronized
  2. ReadWriteLock para escenarios de lectores y escritores
  3. Variables atómicas: actualizaciones sin bloqueo
  4. StampedLock y lecturas optimistas
← Volver a Java Academy