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(); } } }