// 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");
}
}