Eu estou com uma dúvida e gostaria que me ajudassem…
Vou propor um problema:
public synchronized produtor(int valor)
{
while(quantidade_elementos_buffer == buffer.lebgth)
{
wait();
}
buffer[posicao] = valor;
quantidade_elementos_buffer++;
notifyAll();
}
Uma thread que deseja produzir primeiro tem que adquirir o bloqueio do objeto. Faz de conta de a thread adquiriu o bloqueio e entrou no método produtor(). A thread verifica no loop while se o buffer (um vetor com n elementos) está cheio ou não. Se estiver cheio, ele espera e libera o bloqueio. Vamos considerar que ele coloca um elemento na última posição disponível no buffer.
A thread atinge a instrução notifyAll(). Depois de executada, uma thread consumidora entra no estado executável e espera ser alocada pelo Sistema Operacional para executar.
Dúvida: E se o SO decidir que a thread produtora já executou por tempo suficiente exatamente depois de executar notifyAll(), mas antes de atingir o fim do método? Nesse caso, essa thread não vai liberar o bloqueio, mas a thread consumidora pode executar. A thread consumidora tenta obter o bloqueio e não consegue. O seu estado vai para bloqueado novamente. A thread produtora novamente começa a executar, entra no while e verifica que o buffer está cheio. Nesse caso, ela entra no estado de espera e temos um deadlock. O programa trava.
Alguém pode me explicar como programa sai desse cenário que descrevi? Tem algo implícito sendo considerado que ainda não sei.
PS: não coloquei o método consumidor(), mas para entrar nele, a thread consumidora tenta obter o mesmo bloqueio de objeto que o método produtor().