Sistemas de Computação I - Prova 2
PUC-Rio - 1/07/98
Java, que define concorrência baseada em threads, oferece um conceito bastante similar ao de monitores. Métodos de um objeto definidos como synchronized garantem execução com exclusão mútua em relação a qualquer outro método também definido dessa forma. Em contraste com monitores tradicionais, que oferecem variáveis de condição, Java oferece a primitiva de sincronização wait, que faz um processo ficar bloqueado numa fila de espera associada a um objeto, notify, que acorda o primeiro thread nessa fila, e notifyAll, que acorda todos os threads na fila. Não há uma condição específica associada a cada uma dessas primitivas. Observe que, de forma geral, também não há como saber qual thread é o primeiro em uma fila de espera.
Usando os mecanismos descritos (não se preocupe com sintaxe, apenas suponha que existem métodos sincronizados e primitivas wait, notify e notifyAll), defina uma classe semáforo, com operações P() e V(), que implemente semáforos contadores (semáforos comuns). Não se preocupe em garantir uma ordem FIFO associada à primitiva P().
Noemi Rodriguez