pp.05.01-CounterAtomic

Counter mit Atomics threadsicher machen

  • Projekt: pp.05.01-CounterAtomic
  • Bearbeitungszeit: 20 Minuten
  • Musterlösung: 10 Minuten
  • Kompatibilität: mindestens Java SE 10

Quellcode von pp.Counter

Die Klasse Counter ist nicht threadsicher, da ++ und -- keine atomaren Operationen für int sind:

package pp;

class Counter {
    private int c;

    public Counter(int init) {
        this.c = init;
    }

    public void inc() {
        this.c++;
    }

    public void dec() {
        this.c--;
    }

    public int get() {
        return this.c;
    }

}

Aufgaben

  • Schreiben Sie jeweils einen Testfall um inc und dec zu testen.
    Mit den Testfällen soll demonstriert werden, dass Counter nicht threadsicher ist. Das kann bspw. dadurch erreicht werden, dass an demselben Objekt inc aus zwei unterschiedlichen Threads heraus aufgerufen wird. Formulieren Sie die Testfälle so, dass sie scheitern, wenn sich die Race-Condition jeweils auswirkt. Lassen Sie die Testfälle mehrfach laufen und überzeugen Sie sich davon, dass die Klasse tatsächlich nicht threadsicher ist.
    Achtung: Abwesenheit von Fehlerbeobachtung ist kein Beweis für Korrektheit.
  • Machen Sie Counter durch synchronized threadsicher.
  • Lassen Sie die Testfälle erneut ablaufen und überzeugen Sie sich davon, dass sie nun erfolgreich laufen
    Achtung: Abwesenheit von Fehlerbeobachtung ist kein Beweis für Korrektheit.
  • Machen Sie Counter mit einem AtomicInteger und compareAndSet threadsicher.
  • Lassen Sie die Testfälle erneut ablaufen und überzeugen Sie sich davon, dass sie nun erfolgreich laufen
    Achtung: Abwesenheit von Fehlerbeobachtung ist kein Beweis für Korrektheit.
  • Vergleichen Sie die Ausführungszeit der Testfälle.
  • Machen Sie Counter mit einem AtomicInteger und in/decrementAndGet oder getAndDe/Increment threadsicher.
  • Lassen Sie die Testfälle erneut ablaufen und überzeugen Sie sich davon, dass sie nun erfolgreich laufen
    Achtung: Abwesenheit von Fehlerbeobachtung ist kein Beweis für Korrektheit.