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
MemoryBarrierTestnach 1 Sek. sicher und auf eine geordnete Weise beendet wird.