import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.Condition; class TallBeholder{ int maxVerdi = 10; int minVerdi = 0; int tall; Lock lock; Condition tallHarPlass; public TallBeholder(int tall){ this.tall = tall; lock = new ReentrantLock(); tallHarPlass = lock.newCondition(); } public int hentTall(){ return tall; } public int settTall(int nyttTall){ tall = nyttTall; return tall; } public void oekTall(int id){ lock.lock(); try{ if (tall >= maxVerdi){ try{ tallHarPlass.await(); } catch (InterruptedException e ){ System.out.println(e); } } int gammeltTall = tall; System.out.println("Start ID: " + id + " - Tall: " + gammeltTall); int nyttTall = leggTilEn(gammeltTall); tall = nyttTall; System.out.println("Slutt ID: " + id + " - Tall: " + nyttTall); } finally{ lock.unlock(); } } public void minkTall(int id){ lock.lock(); try{ int gammeltTall = tall; System.out.println("Start ID: " + id + " - Tall: " + gammeltTall); int nyttTall = trekkFraEn(gammeltTall); tall = nyttTall; System.out.println("Slutt ID: " + id + " - Tall: " + nyttTall); tallHarPlass.signalAll(); } finally{ lock.unlock(); } } // Unødvendig komplisert måte å plusse 1 til et tall // Det er for å demonstrere problemet man kan få med parallellitet private int leggTilEn(int gammeltTall){ int nyttTall = 0; for (int i = 0; i < gammeltTall + 1; i++){ nyttTall++; } // Denne printen er her for å bruke litt tid System.out.print(""); return nyttTall; } private int trekkFraEn(int gammeltTall){ int nyttTall = 0; for (int i = 0; i < gammeltTall - 1; i++){ nyttTall++; } // Denne printen er her for å bruke litt tid System.out.print(""); return nyttTall; } }