JAVA – Sincronização de Processos Uma situação interessante onde podemos utilizar a sintaxe de programação concorrente é no uso de comunicação entre threads, pois eles podem dividir dados e devem considerar o estado e as atividades de outros threads. Uma situação conhecida é o cenário de produtor/consumidor, onde o produtor gera um stream de dados, o qual é usado pelo consumidor. Por exemplo, imagine uma aplicação em Java onde um thread (o produtor) escreve dados em um arquivo enquanto um segundo thread (o consumidor) lê dados do mesmo arquivo. Este exemplo usa threads concorrentes que dividem uma fonte em comum, devido a isso devemos sincronizá-los. O grande problema dessa situação ocorre quando o produtor é mais rápido que o consumidor ou vice-versa. Para solucionar esses problemas a linguagem JAVA possuem mecanismos como o Lock e o Monitor para sincronizar métodos ou blocos funcionais dos threads. O processo consumidor possui um método chamado get, que faz o acesso aos dados no buffer onde o produtor, através do método put, escreve dados. Com o uso do lock podemos impedir o acesso de outros processos às regiões críticas. Na linguagem Java utilizamos a palavra chame synchronized para efetuar o lock. Monitores: O monitor através do mecanismo lock possibilita ao programador usar métodos para sincronizar os processos. Esses métodos são: wait, notify, notify all, interrupt e timed waits. Wait: Se o thread atual foi interrompido, o método retira-o imediatamente, enviando um InterruptedException. Senão a linha atual é obstruída. Notify: Quando utilizado o Notify notifica o processo que deseja utilizar a região crítica e espera até a sua liberação. Notify All: Ele trabalha da mesma forma do método Notify, exceto que ele notifica todos os processos que ele deseja utilizar a região crítica e espera a liberação. Interrupt: Se o método Thread.interrupt for invocado para um thread suspenso por um wait, o mesmo notificará os mecânicos aplicados, exceto àquele que readquiriam o lock, então o status da Interrupção do thread é ajustado para falso. Se uma interrupção e uma notificação ocorrerem ao mesmo tempo, não há nenhuma garantia sobre qual ação tem a precedência, pois tanto um como o outro será possível. Timed Wait: As versões programadas do método wait(milisegundos) e wait(nanosegundos) fazem exame dos argumentos que especificam o momento máximo desejado de permanecer em espera. A diferença entre o método wait e o timed wait é que enquanto o wait fica em estado de bloqueado até ser liberada a região crítica; enquanto o timed wait tenta acessar a região crítica, e caso não obtenha sucesso aguarda um tempo programado para tentar o acesso novamente a região crítica.