Monitor

Quando um método é definido como synchronized, apenas uma linha de execução pode executá-lo em um dado momento. Se houver uma linha de execução l1 executando o método e outra linha de execução l2 tentar executá-lo, l2 será bloqueada até a conclusão de l1.

Métodos que apresentam esse comportamento de exclusão mútua são denominados monitores.

Sincronização

Um controle refinado sobre o comportamento de monitores é oferecido através dos métodos de sincronização definidos na classe Object. Esses métodos devem ser utilizados apenas no interior de monitores.

O método wait() bloqueia a linha de execução que está executando o monitor. Outras linhas de execução bloqueadas no monitor são liberadas. A linha de execução corrente permanecerá bloqueada até ser notificada para liberação.

A notificação dá-se através do método notify(), que desbloqueia uma linha de execução que tenha invocado wait() e esteja aguardando a liberação do monitor.

O método notifyAll() desbloqueia todas as linhas de execução bloqueadas no monitor. Essas irão competir igualmente pelo acesso ao recurso, sendo que apenas uma delas terá acesso ao monitor de cada vez.

O método wait(ms) comporta-se como wait(), exceto que um tempo máximo de bloqueio de ms milissegundos é definido. Após esse intervalo, se a linha de execução ainda não tiver sido notificada, a linha de execução volta a competir pela execução com outras linhas de execução.


Ivan L. M. Ricarte
Last modified: Tue Sep 24 09:30:36 BRT 2002