import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class FellesBord { // En monitor private int antallPaBordet = 0; /* Invariant: 0 <= antallPaBordet <= BORD_KAPASITET */ private final int BORD_KAPASITET = 5; private Lock bordlas = new ReentrantLock(); private Condition ikkeTomtBord = bordlas.newCondition(); private Condition ikkeFulltBord = bordlas.newCondition(); void settTallerken() throws InterruptedException { bordlas.lock(); try { while (antallPaBordet >= BORD_KAPASITET) { /* sa lenge det er BORD_KAPASITET tallerkner pa bordet er det ikke lov a sette pa flere. */ ikkeFulltBord.await(); } // Na er antallPaBordet < BORD_KAPASITET antallPaBordet++; System.out.println("Antall paa bordet: " + antallPaBordet); ikkeTomtBord.signal(); /* Si fra til den som tar tallerkener. */ } finally { bordlas.unlock(); } } void hentTallerken() throws InterruptedException { bordlas.lock(); try { while (antallPaBordet == 0) { /* Sa lenge det ikke er noen talerkener pa bordet er det ikke lov a ta en */ ikkeTomtBord.await(); } // Na er antallPaBordet > 0 antallPaBordet --; ikkeFulltBord.signal(); /* si fra til den som setter tallerkener pa bordet. */ } finally { bordlas.unlock(); } } }