Como passar em uma entrevista de Java: principais perguntas de nível avançado

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como passar em uma entrevista de Java: principais perguntas de nível avançado



A entrevista para uma posição de desenvolvedor Java de nível avançado (Pleno/Sênior) não é apenas uma verificação de sintaxe. Os entrevistadores querem ver uma compreensão profunda do funcionamento interno da JVM, multithreading, algoritmos do coletor de lixo e nuances da biblioteca padrão. Neste artigo, analisaremos as perguntas mais frequentes e difíceis que o ajudarão a passar com confiança na entrevista técnica.



1. Multithreading e sincronização: de volatile a Lock



A entrevista avançada de Java quase sempre começa com perguntas sobre multithreading. Você precisa não apenas conhecer a palavra-chave synchronized, mas também entender como funcionam volatile, AtomicInteger, ReentrantLock e o que é happens-before.



Pergunta: Qual é a diferença entre synchronized e ReentrantLock?

A principal diferença é a flexibilidade. synchronized é um bloqueio no nível do monitor do objeto. ReentrantLock oferece recursos avançados: a capacidade de interromper a espera de uma thread (lockInterruptibly()), tentativa de aquisição sem bloqueio (tryLock()), além de suporte a múltiplas condições (Condition).



// Exemplo de uso do ReentrantLock com Conditionimport java.util.concurrent.locks.ReentrantLock;import java.util.concurrent.locks.Condition;

public class BlockingQueueExample { private final ReentrantLock lock = new ReentrantLock(); private final Condition notFull = lock.newCondition(); private final Condition notEmpty = lock.newCondition(); private final Object[] items = new Object[10]; private int putIndex, takeIndex, count;

public void put(Object x) throws InterruptedException { lock.lock(); try { while (count == items.length) { notFull.await(); // espera até que haja espaço livre } items[putIndex] = x; if (++putIndex == items.length) putIndex = 0; count++; notEmpty.signal(); // sinaliza que um elemento apareceu } finally { lock.unlock(); } }

public Object take() throws InterruptedException { lock.lock(); try { while (count == 0) { notEmpty.await(); // espera até que um elemento apareça } Object x = items[takeIndex]; if (++takeIndex == items.length) takeIndex = 0; count--; notFull.signal(); // sinaliza que o espaço foi liberado return x; } finally { lock.unlock(); } }}


Pergunta: Como funciona a palavra-chave volatile?

volatile garante que a leitura e a escrita de uma variável ocorram diretamente na memória principal (main memory), ignorando o cache da CPU. Isso garante a visibilidade das alterações para todas as threads, mas não garante a atomicidade (por exemplo, o incremento count++ ainda requer sincronização).



Também vale lembrar sobre happens-before: a escrita em uma variável volatile ocorre antes de qualquer leitura subsequente dessa mesma variável por outra thread.



2. Java Memory Model (JMM) e Garbage Collector



Entender como a JVM gerencia a memória é um requisito obrigatório para um desenvolvedor Sênior. Os entrevistadores frequentemente perguntam sobre as diferentes gerações (Young/Old Generation), tipos de coletores de lixo e configuração da JVM.



Pergunta: Quais tipos de Garbage Collector existem no Java 17?

O Java moderno (17+) suporta vários GCs:

  • G1GC (Garbage First) — GC padrão. Divide o heap em regiões e coleta lixo nas regiões com a maior quantidade de objetos mortos.
  • ZGC (Z Garbage

Blogs

Book Recommendations