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 localYExemplo 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 modeIntuiçã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 stateVerificaçã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
- ReentrantLock versus synchronized
- ReadWriteLock em Cenários de Leitura e Escrita
- Variáveis Atômicas: Atualizações sem Bloqueios
- StampedLock e Leituras Otimistas