Zurück zum Manuskript
// Datei: NoLostUpdate.java // Datum: 02.11.2018 // Autor: Brecht // Thema: Zwei Threads greifen 100-mal miteinander konkurrierend // auf eine int-Variable mit dem Wert 1 zu und erhöhen // ihn jeweils mit einer synchronisierten Methode um 1. // Die Ausgabe ist stets: // Erhalte 0x2 und 100x3 // ------------------------------------------------------------- class Zaehler { int i = 0; synchronized void update() { i++; } // <== Einzige Programm- // Änderung gegen int getValue() { return i; } // LostUpdate.java void setValue(int wert) { this.i = wert; } } // ------------------------------------------------------------- class MyThread extends Thread { Zaehler myz; MyThread(Zaehler za) { this.myz = za; } public void run() { try { Thread.sleep(50); } catch(Exception e) { System.out.println("Sleep-Fehler"); System.exit(0); } myz.update(); } } // ------------------------------------------------------------- class NoLostUpdate { public static void main(String[] unused) throws Exception { int anz2 = 0; int anz3 = 0; Zaehler z = new Zaehler(); for(int k=0; k<100; k++) { MyThread t1 = new MyThread(z); MyThread t2 = new MyThread(z); z.setValue(1); // Jeweiliger Anfangswert t1.start(); t2.start(); t1.join(); t2.join(); if(z.getValue() == 2) anz2++; else anz3++; } System.out.println("Erhalte "+anz2+"x2 und "+anz3+" x3"); } }

Zurück zum Manuskript