Grupo H - DCCE/Ibilce/Unesp

Propaganda
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.
Download