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:

void codiceFilosofo(int index) throws InterruptedException {
    while(true) {
        // PENSA 
        System.out.println("Filosofo " + index +" pensa");
        Thread.sleep(1000);
        
        t.raccogli_sx(index);   // raccoglie la bacchetta sinistra
        t.raccogli_dx(index);   // raccoglie la bacchetta destra

        //MANGIA
        System.out.println("Filosofo " + index +" mangia");
        Thread.sleep(1000);

        t.deposita_sx(index);   // deposita la bacchetta sinistra
        t.deposita_dx(index);   // deposita la bacchetta destra
    }
}

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.

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:

void codiceFilosofo(int index) throws InterruptedException {
    while(true) {
        // PENSA 
        System.out.println("Filosofo " + index +" pensa");
        Thread.sleep(1000);
        
        t.raccogli(index);  // raccoglie atomicamente le bacchette

        //MANGIA
        System.out.println("Filosofo " + index +" mangia");
        Thread.sleep(1000);

        t.deposita(index);  // deposita le bacchette
    }
}

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

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.