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 { // To betingelser f?r en tr?d kan fortsette ut av while-l?kken: // 1. Det finnes kaffe (antallKaffe > 0) - signal() i lagKaffe() // 2. Cafeen er stengt (erStengt = true) - signallAll() i steng() while (antallKaffe == 0 && !erStengt){ // vente betingelse ikkeTomt.await(); // kunde-tr?den m? vente p? kaffe (signal) } // 1. Finnes kaffe, og er ikke stengt if (!erStengt) { // skriver ikke ut dersom cafeen er stengt System.out.println("Kunde "+ kundeId + " - Drikker kaffe"); antallKaffe--; // 2. Cafeen er stengt } else { System.out.println("Fikk ikke kaffen, cafe stengt"); } } finally { laas.unlock(); } } public void steng(){ laas.lock(); try { erStengt = true; ikkeTomt.signalAll(); // lar alle som venter fortsette } finally { laas.unlock(); } } }