Na aula, analisamos os sincronizadores de alto nível de
java.util.concurrent:
CountDownLatch,
CyclicBarrier,
Phaser e
Exchanger. Aprendemos a coordenar o início e o término de tarefas via
await()/
countDown(), construir fases reutilizáveis e ações de barreira com
await(), gerenciar participantes dinâmicos da “orquestra” com
register()/
arriveAndAwaitAdvance()/
arriveAndDeregister() e trocar dados em pares por meio de
exchange(). Na prática, implementamos uma largada em massa de workers e um “tick” de jogo, e também abordamos erros típicos: uso único do
CountDownLatch, tratamento de
BrokenBarrierException e
deregister() correto. Em todos os casos, evitamos a dor de
wait()/
notify().