pp.02.01-MemoryBarrier

Anwendung von Memory Barrieren

  • Projekt: pp.02.01-MemoryBarrier
  • Bearbeitungszeit: 15 Minuten
  • Musterlösung: 15 Minuten
  • Kompatibilität: mindestens Java SE 10

Durch das Setzen von stopped soll der MemoryBarrierTest-Thread kontrolliert beendet werden, indem die while-Schleife und damit die run()-Methode des Threads terminiert.

Wenn stopped aber aus einem anderen Thread heraus geändert wird, kann es sein, dass die Speicheränderung lokal im Speicher-Cache des ändernden Threads verbleibt und dem MemoryBarrierTest-Thread nicht übermittelt wird. Auf einem Single-Core-System wird dies zwar nie passieren, denn bei jedem Kontextwechsel durch den Scheduler wird auch der threadlokale Speicher-Cache synchronisiert, aber auf Multicore-Systemen wird es wahrscheinlich dazu kommen, dass der Thread nicht korrekt terminiert.

Quellcode von MemoryBarrierTest

public class MemoryBarrierTest extends Thread {

    public boolean stopped = false;

    @Override
    public void run() {
        while (!this.stopped) {
            // work
        }
        System.out.println("MemoryBarrierTest-Thread actually stopped.");
    }

    public static void main(String... args) throws InterruptedException {
        var t = new MemoryBarrierTest();
        t.start();
        Thread.sleep(1000);
        t.stopped = true;
        System.out.println("Main thread set stopped on MemoryBarrierTest-Thread.");
    }

}

Aufgaben

  • Ändern Sie das Programm so, dass der Thread von MemoryBarrierTest nach 1 Sek. sicher und auf eine geordnete Weise beendet wird.