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.