// Bank med monitor og konto som aldri blir negativ import java.util.concurrent.locks.*; class Bank3 { public static void main(String[] argv) throws InterruptedException { Konto konto = new Konto(2000); Thread giTr?d = new Thread(new GiRun(konto)); Thread taTr?d = new Thread(new TaRun(konto)); giTr?d.start(); taTr?d.start(); giTr?d.join(); // Venter p? at tr?den blir ferdig. Mer om dette i Tr?der del 2! taTr?d.join(); System.out.println("Penger p? konto: " + konto.penger); } } class GiRun implements Runnable { Konto konto; GiRun(Konto konto) { this.konto = konto; } @Override public void run() { for (int i = 0; i < 1000000; i++) { this.konto.gi(); } } } class TaRun implements Runnable { Konto konto; TaRun(Konto konto) { this.konto = konto; } @Override public void run() { for (int i = 0; i < 1000000; i++) { this.konto.ta(); } } } // Felles data (tr?dsikker) class Konto { int penger; Lock l?s = new ReentrantLock(); Condition ikkeTom = l?s.newCondition(); Konto(int penger) { this.penger = penger; } public void ta() { int x; l?s.lock(); try { if (this.penger <= 0) { try { System.out.print("Kontoen er tom! Venter p? penger..."); ikkeTom.await(); System.out.println("Penger mottatt!"); } catch (InterruptedException e) { return; } } x = this.penger; x = x - 500; this.penger = x; } finally { l?s.unlock(); } } public void gi() { int x; l?s.lock(); try { x = this.penger; x = x + 500; this.penger = x; ikkeTom.signal(); } finally { l?s.unlock(); } } }