PROBLEMA DOS FILÓSOFOS

Por: Evandro Ricardo da Veiga Schultz & Rodrigo Uzun Fleischmann

O Problema dos Filósofos é um exemplo clássico da área de Programação Concorrente. Tem por objetivo demonstrar a alocação de recursos quando temos processos que concorrem pela alocação dos mesmos, ou seja, os recursos são escassos.

A implementação proposta apresenta cinco (5) filósofos e cinco (5) garfos. A idéia central deste problema é que dado os FILÓSOFOS e os GARFOS em um JANTAR, cada filósofo necessita de DOIS (2) garfos para comer. Os filósofos podem estar em um destes três (3) estados: PENSANDO, FAMINTO ou COMENDO. Se um filósofo está no estado PENSANDO e quer passar para o estado COMENDO, ele tenta pegar dois (2) garfos. Se ele não consegue pegar os dois (2) garfos, passa o estado FAMINTO. Se consegue pegar os dois garfos ele passa para o estado COMENDO. Enquanto no estado FAMINTO, o filósofo permanece tentando pegar os garfos, ou seja, fica esperando a liberação dos garfos.

Como é de conhecimento, caso não exista uma ordem para pegar os garfos, pode ocorrer deadlocks ou espera eterna. Para tanto adotamos a seguinte solução: quando um filósofo quer comer, ele toma um garfo do filósofo a sua direita, se este filósofo não o estiver usando. Assim sendo, os métodos que implementam o ato de pegar e liberar os garfos são sincronizados, ou seja, somente um (1) filósofo entra no corpo do método por vez.

Na implementação, utilizamos três módulos: jantar.java, garfos.java, filósofos.java. O código-fonte (comentado) de cada módulo está disponível logo abaixo:

jantar.java
garfos.java
filósofos.java

Execução da Applet