Il problema dei filosofi in Java

Esercizio 1: filosofi a cena

Implementare in Java la soluzione del problema classico dei filosofi a cena. Utilizzare il seguente codice per i filosofi:

Provare a schedulare i filosofi (tramite opportune sleep) in modo da:

  1. osservare che due filosofi, non vicini, possono mangiare contemporaneamente;
  2. osservare lo stallo.
Visualizza la soluzione

La seguente soluzione sincronizza correttamente i filosofi. Eseguendola più volte è possibile osservare che due filosofi possono mangiare contemporaneamente. Per forzare lo stallo è sufficiente decommentare la sleep tra la raccolta delle due bacchette.

Esercizio 2: filosofi con raccolta “atomica”

I monitor rendono semplice la realizzazione di soluzioni in cui le condizioni di bloccaggio sono complesse e non realizzabili tramite un semplice contatore (come nel caso dei semafori). Implementare i filosofi a cena con la raccolta delle bacchette atomiche. Utilizzare il seguente codice per i filosofi:

Provare a schedularli (o a ridurre il numero dei filosofi) in modo da osservare la starvation di un filosofo.

Visualizza la soluzione

La seguente soluzione sincronizza correttamente i filosofi con la raccolta atomica delle bacchette.

Eseguendola più volte è possibile osservare che due filosofi possono mangiare contemporaneamente. Per forzare osservare la starvation è sufficiente ridurre il numero di filosofi (NTHREAD) a 3. In questo modo si osserveranno solo due filosofi che mangiano e il terzo che “muore di fame” (to starve), letteralmente.

Esercizio 3: filosofi con coda esplicita

Evitare la starvation della soluzione precedente introducendo una coda in Java che implementi una politica First Come First Served (FCFS o FIFO). L’idea è che prima di un blocco while-wait il thread si accodi. Nella condizione del while controlliamo in primo luogo se il thread non è il primo della coda, e in tal caso lo blocchiamo di nuovo indipendentemente dalla condizione di attesa. Quando il thread supera il blocco while lo rimuoviamo dalla coda.

Visualizza la soluzione

La seguente soluzione aggiunge una coda esplicita private Queue coda nel monitor che viene utilizzata per preservare l’ordine di arrivo ed evitare la starvation. La coda viene usata nel metodo raccogli: il filosofo viene aggiunto alla coda e attende finché non è il suo turno o non ci sono le bacchette. Appena supera il ciclo while si toglie dalla coda e procede normalmente.