import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Condition; public class Cafe { // V?r "Monitor" -> objekt som h?ndterer felles data private int antallKaffe = 0; public boolean erStengt = false; private Lock laas = new ReentrantLock(); // Condition : k? for trader f?r de kan fortsette (betingelse) private Condition ikkeTomt = laas.newCondition(); public void lagKaffe(int baristaId){ // antallKaffe felles data -> kritisk region laas.lock(); try { System.out.println("Barista "+ baristaId + " - Lager kaffe"); antallKaffe++; ikkeTomt.signal(); // Om en tr?d venter pga tomt -> tr?den kan fortsette } finally { laas.unlock(); } } public void drikkKaffe(int kundeId) throws InterruptedException { laas.lock(); try { while (antallKaffe == 0 && !erStengt){ ikkeTomt.await(); // kunde-tr?den m? vente p? kaffe (signal) } if (!erStengt) { // skriver ikke ut dersom cafeen er stengt System.out.println("Kunde "+ kundeId + " - Drikker kaffe"); antallKaffe--; } } finally { laas.unlock(); } } public void steng(){ laas.lock(); try { erStengt = true; ikkeTomt.signalAll(); // lar alle som venter fortsette } finally { laas.unlock(); } } }