/media/sda-magnetic/david/Dok-15-2023-11-27/fernuni-hagen/cs-i-ii/old-cs-2-03/java-new/java7.txt


Parallelität von Programmen

Verschicken von Nachrichten zwischen Objekten

Sequentiell

Parallel:

1. Mehrere Rechner
2. Eigener Prozess, alle Prozesse auf einem Rechner, Mehrkern
3. Quasi parallel

Grenze fließend: Verteilte Systeme

lokale Parallelität

real parallel
virtuell parallel

Ausführungsstränge (Threads)

Ausführungs squentiellen Programms: Ausführungsstrang, execution thread, thread

Erzeugen und Starten zusätzlicher Threads

Synchronisieren mehrerer Threads, Aufgaben 

1. In kritischen Programmbereichen maximal ein Thread

Zuteilung von Rechenzeit

Scheduler

preemptives, nicht-preemptives Scheduling

Atomare Aktionen

Parallelität in objektorientierten Sprachen 

1. Threads zwischen Objekten 
2. Jedes Objekt hat seinen eigenen Thread

Lokale Parallelität in Java-Programmen 

Java-Threads 

Thread-Object 

VM-Thread 

Beschreiben  und Starten von Threads 

Ganz normales Objekt 

Wird mit der Methode start aufgerufen 

Parameterlose Methode run

public class MyThread extends Thread {
    @Override
    public void run () {
        // Hier steht der Code
    }
}

Der neue Thread wird so gestartet:

Thread myThread = new MyThread ();
myThread.start ();

Vier verschiedene Zustände

1.) Neu - d.h. start wurde noch nicht aufgerufen 
2.) Lauffähig - d.h. er wird gerade ausgeführt oder könnte es
3.) Seine Ausführung ist blockiert 
4.) Er kann tot sein, d.h. run ist blockiert 

1.) Lauffähig
2.) Rechenbereit
3.) Rechnend


nue -> Rechenbereit <-> Rechnend -> tot

Schlafend, wartend
EA-Blockiert, Monitorblockiert

yield

sleep

Monitor-blockiert


Kommunikation von Threads über den zentralen Speicher

Zentraler Speicher
Jeder Thread hat eigenen Stack
Gemeinsamer Speicher

Java definiert eigenes Speichermodell, weil eventuell Prozesse auf unterschiedlichen Computern, ohne gemeinsamen Speicher 

Fehlende sequentielle Konsistenz

Schlüsselwort volatile

Kommunikation von Threads über unterbrechungen 

Methode: interrupt

void interrupt()
boolean isInterrupted()
static boolean interrupted()

sleep()
wait()

Interrupt-Flag 

Scheduling von Threads 

Verhungern, starvation

Synchronisation

1. Gebrauch gemeinsamer Ressourcen
2. ..
3. ..
4. Unbedachte Synchronisation: Verklemmung

Bsp: Gemeinsame Variable

Bsp.: Konto: 

public class Konto {
    private int saldo;
    
    public Konto (int saldo) {
        this.saldo = saldo;
    }
    
    public void einzahlen (int betrag) [
        saldo = saldo + betrag;
    }
}

Oder

public class Konto {
    private int saldo;
    
    public Konto (int saldo) {
        this.saldo = saldo;
    }
    
    public void einzahlen (int betrag) [
        int tmp = saldo + betrag;
        saldo = tmp;
    }
}

Kritische Bereiche

Kooperation 

Zwei Threads kooperieren: Der eine Thread wartet, bis der andere eine bestimmte Leistung erbracht hat.

Fairness und Verhungern 

Die Sprachspezifikation von Java fordert keine Fairness => Programmierende müssen diese Aufgabe übernehmen 

Methode: yield

yield signalisiert dem Scheduler, dass der Laufende Thread den Prozessor freigeben will 

Verhungern kann statt durch fehlende Fairness auch druch fehlerhafte Synchronisation entstehen 


Ein objektorientiertes Monitorkonzept

Monitor: Überwachungseinheit, die den Zugang zu bestimmten Anweisungsfolgen kontrolliert

Zuordnung eines Monitors zu einer Methode oder einem Block 

Um einen Block oder eine Methode einem Monitor zur Überwachung zu zu ordnen, wird das Schlüsselwort 

"synchronized"

verwendet. 

Bei der Deklaration "synchronized" vorstellen. 

Sperren von Monitoren 

Falsche Verwendung von Monitoren: Problem 

Synchronisierte Blöcke 

Synchronisation von Methoden 
Synchronisation von Blöcken 

wait/notify Mechanismus