// Bank med monitor import java.util.concurrent.locks.*; class Bank2 { 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; Konto(int penger) { this.penger = penger; this.l?s = new ReentrantLock(); } public void ta() { int x; l?s.lock(); try { 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; } finally { l?s.unlock(); } } }