volatile garante visibilidade e ordenação: uma escrita é vista por qualquer thread que leia aquele campo depois, e estabelece uma aresta happens before, então escritas feitas antes dela também ficam visíveis. Ele não dá atomicidade, então count mais mais continua sendo uma corrida porque é uma leitura, uma soma e uma escrita. Para ações compostas use synchronized, um lock, ou uma classe atômica como AtomicLong.
Por que os entrevistadores perguntam isso
É a forma mais limpa de descobrir se alguém entende o modelo de memória do Java ou apenas sabe que volatile significa compartilhado. O entrevistador quer a distinção entre visibilidade e atomicidade enunciada com precisão, mais um caso de uso válido como uma flag de parada. Os follow ups tendem a ir para double checked locking, as classes atômicas e como synchronized fornece tanto exclusão mútua quanto os mesmos efeitos de memória.
Como estruturar sua resposta
- Divida a garantia em visibilidade e ordenação.
- Diga claramente o que ele não faz: operações compostas seguem com corrida.
- Dê um uso legítimo, como uma flag que para um laço.
- Cite o que você usa no lugar quando precisa de atomicidade.
Exemplo de resposta
volatile significa que uma leitura sempre enxerga a escrita mais recente em vez de um valor cacheado num registrador ou no cache de um núcleo, e impede que compilador e processador reordenem em volta dele. A forma do modelo de memória de dizer isso é que ele cria uma aresta happens before, então tudo que a thread escritora fez antes da escrita volatile fica visível para uma thread que a lê depois. O que ele não me dá é atomicidade. Um incremento de contador são três operações, então duas threads podem ler o mesmo valor e uma atualização se perde, por mais volatile que o campo seja. Meu uso válido de sempre é uma flag booleana que manda um laço em background parar, onde uma única escrita e uma única leitura são exatamente o padrão. Qualquer coisa de ler, modificar e escrever vai para um AtomicInteger, um LongAdder se for quente o bastante para a contenção importar, ou um lock se vários campos precisam mudar juntos. O outro ponto em que eu confio no modelo de memória é a publicação segura, já que campos final têm visibilidade garantida depois da construção, o que é um bom motivo para tornar as coisas imutáveis.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- Por que double checked locking era quebrado antes de volatile ser corrigido?
- Como synchronized te dá as mesmas garantias de memória?
- Quando você usaria LongAdder em vez de AtomicLong?
Mais perguntas para Desenvolvedor Java
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas