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