Pergunta de entrevista para Desenvolvedor Java

O que volatile realmente garante, e quando isso não basta?

O que o entrevistador está avaliando, como estruturar sua resposta e um exemplo falado que você pode adaptar.

Resposta rápida

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

Exemplo falado, em primeira pessoa

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 funciona

Perguntas 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

Ensaie as perguntas difíceis antes que elas apareçam

Pratique com um copiloto ao vivo e depois entre pronto. Um Session Pass de $29 te leva até o fim da entrevista, sem assinatura e sem amarras.

Instalar o GhostPilot