Apoio escrito: tarefa não é thread
Este apoio reexplica tarefa, thread e estado compartilhado com duas somas e um contador. Uma tarefa descreve o trabalho; uma thread é um caminho de execução que pode realizá-lo. Um executor administra as threads e recebe tarefas. Future representa um resultado que pode ficar pronto depois; get() espera esse resultado e permite observar falhas.
import java.util.concurrent.Executors;
public class Tarefas {
public static void main(String[] args) throws Exception {
try (var executor = Executors.newFixedThreadPool(2)) {
var primeira = executor.submit(() -> 20 + 22);
var segunda = executor.submit(() -> 6 * 7);
System.out.println(primeira.get()); // 42
System.out.println(segunda.get()); // 42
}
}
}
As tarefas acima não compartilham dados. Se duas threads fizerem contador++, ambas podem ler o mesmo valor e gravar o mesmo próximo valor: uma atualização se perde. AtomicInteger.incrementAndGet() resolve o incremento isolado; uma regra composta, como “verificar estoque e reservar”, precisa proteger a operação inteira.
Concorrência significa atividades que avançam em períodos sobrepostos; paralelismo é execução simultânea. Threads ajudam a organizar trabalho, mas não tornam automaticamente o código mais rápido ou seguro.
Material complementar da Fernanda
- Guia avançado: sincronização e race conditions — Compare
synchronized, locks e operações atômicas. O mapeamento de uma thread Java para uma thread do sistema operacional descreve threads de plataforma; Java 21 também oferece virtual threads.
Pratique com /aprender
Copie o comando e cole no chat para iniciar uma prática guiada:
/aprender Pratique tarefas, threads e condições de corrida em Java 21. Peça que eu explique como dois incrementos concorrentes podem terminar em apenas um incremento e compare com AtomicInteger. Depois mude o caso para uma operação composta de estoque. Uma etapa por vez, sem mostrar a solução antes.
