0Pricing
Java Academy · Aula

StampedLock e Leituras Otimistas

Aplique o modo de leitura otimista de StampedLock em cargas de trabalho de alto volume dominadas por leituras.

StampedLock e Leituras Otimistas é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.

O que é StampedLock?

Introduzido no Java 8, StampedLock amplia os conceitos de ReadWriteLock com um modo adicional de leitura otimista. As operações retornam uma marca long usada para liberar o bloqueio ou validar a leitura otimista.

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 leitura otimista

A leitura otimista não adquire nenhum bloqueio — apenas obtém uma marca. Após a leitura, valide a marca. Se a validação falhar (um escritor interveio), recorra a um bloqueio de leitura 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

Exemplo completo de Point2D

Exemplo clássico de StampedLock — um ponto 2D com leituras otimistas:

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

Conversão de bloqueio

StampedLock permite converter entre modos de bloqueio:

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

Quando as leituras otimistas são mais úteis

As leituras otimistas são especialmente úteis quando:

  • As leituras são muito mais frequentes que as escritas
  • O instantâneo dos dados cabe em poucas variáveis locais (sem alocação de objetos)
  • A contenção de escrita é baixa (a validação raramente falha)

Se as escritas forem frequentes, as leituras otimistas recairão repetidamente em bloqueios de leitura completos — sem oferecer benefício.

StampedLock vs ReadWriteLock

Principais diferenças:

  • StampedLock: acrescenta leituras otimistas; NÃO é reentrante; não oferece suporte a Condition
  • ReentrantReadWriteLock: é reentrante; oferece suporte a Conditions; não possui modo otimista

StampedLock é mais rápido sob baixa contenção de escrita. ReentrantReadWriteLock é mais seguro e oferece mais recursos.

StampedLock NÃO é reentrante

Diferentemente de ReentrantLock, StampedLock NÃO é reentrante. Uma linha de execução que tentar adquirir um modo que já mantém causará um deadlock:

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

tryWriteLock e tryReadLock

Tentativas de aquisição sem bloqueio retornam 0 quando não são bem-sucedidas:

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

Usando como ReadWriteLock

StampedLock pode retornar uma visualização como um ReadWriteLock padrão para oferecer compatibilidade:

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

Intuição sobre avaliações de desempenho

Os resultados das avaliações de desempenho normalmente mostram:

  • Carga de trabalho com muitas leituras (99% de leituras): StampedLock > ReadWriteLock > synchronized
  • Carga de trabalho mista (70% de leituras): ReadWriteLock ≈ StampedLock
  • Carga de trabalho com muitas escritas: synchronized ou ReentrantLock geralmente vencem (menor custo adicional)

Sempre analise o desempenho com cargas de trabalho realistas antes de otimizar.

Invalidade da marca após o desbloqueio

Depois que um bloqueio é liberado com uma marca, essa marca se torna inválida. Usar uma marca antiga após o desbloqueio resulta em comportamento indefinido — sempre capture uma marca nova a cada aquisição do bloqueio.

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

Verificação rápida

Uma leitura otimista com tryOptimisticRead() e uma chamada subsequente a validate(stamp) retorna false. O que o código deve fazer em seguida?

Recapitulação: StampedLock

Principais conclusões:

  • Três modos: leitura otimista (sem bloqueio), bloqueio de leitura e bloqueio de escrita
  • tryOptimisticRead() + validate() — tentativa de leitura sem custo
  • Se a validação falhar → recorra a readLock()
  • NÃO é reentrante — há risco de deadlock se a mesma linha de execução adquirir o bloqueio novamente
  • Não oferece suporte a Condition — use ReentrantReadWriteLock quando necessário

Perguntas Frequentes

A aula “StampedLock e Leituras Otimistas” é grátis?

Sim — o texto completo de “StampedLock e Leituras Otimistas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.

O que vou aprender em “StampedLock e Leituras Otimistas”?

Aplique o modo de leitura otimista de StampedLock em cargas de trabalho de alto volume dominadas por leituras. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Java Academy?

Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “StampedLock e Leituras Otimistas”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Java Academy?

Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. ReentrantLock versus synchronized
  2. ReadWriteLock em Cenários de Leitura e Escrita
  3. Variáveis Atômicas: Atualizações sem Bloqueios
  4. StampedLock e Leituras Otimistas
← Voltar para Java Academy