import java.util.concurrent.locks.*; class Monitor { int kaffe = 0; int kaker = 0; final int maksKaffe = 4; final int maksKaker = 4; private final Lock l?s = new ReentrantLock(); private final Condition ordreKlar = l?s.newCondition(); private final Condition kaffeIkkeFull = l?s.newCondition(); private final Condition kakerIkkeFull = l?s.newCondition(); public void leggTilKaffe() throws InterruptedException { l?s.lock(); try { while (kaffe == maksKaffe) { kaffeIkkeFull.await(); } kaffe++; System.out.println("En kaffe klar"); if (kaffe > 0 && kaker > 0) { ordreKlar.signal(); } } finally { l?s.unlock(); } } public void leggTilKaker() throws InterruptedException { l?s.lock(); try { while (kaker == maksKaker) { kakerIkkeFull.await(); } kaker++; System.out.println("En kake klar"); if (kaffe > 0 && kaker > 0) { ordreKlar.signal(); } } finally { l?s.unlock(); } } public void hentOrdre() throws InterruptedException { l?s.lock(); try { while (kaker == 0 || kaffe == 0) { ordreKlar.await(); } kaffe--; kaker--; System.out.println("En ordre er hentet"); kakerIkkeFull.signal(); kaffeIkkeFull.signal(); } finally { l?s.unlock(); } } }