Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread...

82
Nebenl Nebenl ä ä ufigkeit in Java ufigkeit in Java Prof. Dr. Prof. Dr. Margarita Esponda Margarita Esponda

Transcript of Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread...

Page 1: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

NebenlNebenlääufigkeit in Javaufigkeit in Java

Prof. Dr. Prof. Dr. Margarita EspondaMargarita Esponda

Page 2: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Gliederung der VorlesungGliederung der Vorlesung

- Konzepte der Nebenläufigkeit

- Threads in Java

- Synchronisationsprobleme

- Klassische Lösungen

- Semaphoren

- Monitore

- Lebenszyklus eines Threads

Page 3: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

WettersimulationBetriebssysteme

Suchmaschinen

Computerspiele

Wo finden wir NebenlWo finden wir Nebenlääufigkeit?ufigkeit?

GUIs

Page 4: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

ParallelitParallelitäätt

Echte Parallelität Virtuelle Parallelität

Mehrere Prozesse laufen auf der selben CPU

Prozesse laufen auf unterschiedlichen CPUs

Prozess1Prozess1

Prozess2Prozess2

Prozess3Prozess3

Prozess1Prozess1

Prozess2Prozess2

Prozess3Prozess3

Prozess3Prozess3 Prozess3

Prozess3

Page 5: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Grundlegende BegriffeGrundlegende Begriffe

"single program""single program"

"task switching"

"multitasking"

"multithreading"

In der Steinzeit der PCs durfte man nur einzelne Programme streng sequentiell ausführen.

Mehrere Programme liegen im Hauptspeicher.

Durch Umschaltung setzt man die Ausführung eines der Programme fort.

Das Betriebssystem schaltet die Programme um. Man hat das Gefühl, dass mehrere Programme parallel laufen.

Es gibt mehrere Programmfäden, die parallel

innerhalb eines Programms ausgeführt werden.

Page 6: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

"Multitasking" vs. "Multithreading""Multitasking" vs. "Multithreading"

mehrere Prozesse mehrere Prozesse ((processprocess))

jeder Prozess hat eine eigene Umgebung

Kein gemeinsamer Adressraum

Verwaltung durch das Betriebssystem

mehrere Programmfäden (thread)

alle Threads laufen in der gleichen Umgebung

gemeinsamer Adressraum !!!

Verwaltung innerhalb eines Prozesses

Page 7: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Multitasking + MultithreadingMultitasking + Multithreading

Prozess 1 Prozess 2 Prozess 3

Thread 1 Thread 2

Adressraumfür Prozess 1

Adressraumfür Prozess 2 Adressraum

für Prozess 3

Page 8: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

MultitaskingMultitasking

Prozess1Prozess1

Betriebssystem

Prozess2Prozess2

Prozess3Prozess3

Lokaler SpeicherLokaler Speicher

Lokaler SpeicherLokaler Speicher

Lokaler SpeicherLokaler Speicher

Gemeinsamer Speicher

Gemeinsamer Speicher Prozesse werden direkt vom

Betriebssystem verwaltet.

Jeder Prozess bekommt einen eigenen Speicherbereich vom Betriebssystem zugeteilt.

Page 9: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Multitasking + MultithreadingMultitasking + Multithreading

JVMJVM

Java Virtuelle MaschineJava Virtuelle Maschine

Thread1Thread1 Lokaler SpeicherLokaler Speicher

Lokaler SpeicherLokaler SpeicherThread2Thread2

Lokaler SpeicherLokaler SpeicherThread3Thread3

Gemeinsamer Speicherbereich

Gemeinsamer Speicherbereich

Prozess1Prozess1

Betriebssystem

Prozess2Prozess2

Lokaler SpeicherLokaler Speicher

Lokaler SpeicherLokaler Speicher

Page 10: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Gliederung der VorlesungGliederung der Vorlesung

- Konzepte der Nebenläufigkeit

- Threads in JavaThreads in Java

- Synchronisationsprobleme

- Klassische Lösungen

- Semaphoren

- Monitore

- Lebenszyklus eines Threads

Page 11: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Ein Ein ThreadThread ist ein eigenstist ein eigenstäändiges Programmfragment, ndiges Programmfragment, das parallel zu anderen Programmfragmenten (das parallel zu anderen Programmfragmenten (ThreadsThreads) ) laufen kann.laufen kann.

Threads:Threads: kköönnen die Bedienbarkeit von nnen die Bedienbarkeit von Dialoganwendungen verbessern, indem rechenintensive Dialoganwendungen verbessern, indem rechenintensive Anwendungen im Hintergrund ablaufen.Anwendungen im Hintergrund ablaufen.

ThreadsThreads werden auch als werden auch als leichtgewichtigeleichtgewichtige ProzesseProzessebezeichnet.bezeichnet.

Threads Ausführungsstrang

Page 12: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Threads in JavaThreads in Java

Ein Programmfaden oder Ausführungsstrang wird durch

ein Objekt des Typs Thread repräsentiert.

Die Klasse Thread ist eine vollständige Implementierung

des Runnable-Interfaces.

Das Runnable-Interface stellt Klassen von Objekten

die parallel ausführbaren Programmcode beinhalten.

public interface Runnable {

public abstract void run();

}

Page 13: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Programmierung von ThreadsProgrammierung von Threads

Thread-Klassen können in Java auf zwei verschiedene

Arten definiert werden:

als Unterklasseder Thread-Klasse

durch Implementierungder Runnable-Schnittstelle

public class Counter extends Thread { . . .

public void run(){

. . .}

}

public class Counter implements Runnable{ . . .

public void run(){

. . .}

}

Die Methode run() muss überschriebenwerden

Die Methode run() muss implementiertwerden

Page 14: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

DieDie ThreadThread--KlasseKlasse

Thread ( ); // erzeugt ein leeres Thread-Objekt mit

// automatisch festgelegtem Namen Thread-N

Thread ( String name );// erzeugt ein leeres Thread-Objekt mit Namen name

Thread ( Runnable target )

// erzeugt zu Runnable-Objektziel ein Thread-Objekt

Thread ( Runnable target, String name )

// erzeugt zu Runnable-Objektziel ein Thread-Objekt

// mit Namen name

Einige Konstruktoren

Page 15: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

run()-Methode

Innerhalb der run()-Methode befinden sich die

potenziell parallel ausführbaren Aktivitäten

eines Threads.

start() - Methode

Startet ein Thread und zwar:

- es wird Speicher für den Thread bereit gestellt

- und die run-Methode wird aufgerufen

DieDie ThreadThread--KlasseKlasse

Page 16: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Beispiel:Beispiel: public class SimpleThread extends Thread {

public SimpleThread ( String name ) {super(name);

}

public void run(){for( int i=0; i<100; i++ )

System.out.print( this.getName() );}

}

public class TestSimpleThread {

public static void main( String[] args ){

SimpleThread tAnne = new SimpleThread("Anne ");

SimpleThread tPeter = new SimpleThread("Peter ");

tAnne.start();

tPeter.start();

}

}

Anne Anne Anne Anne Anne Anne Anne Anne Anne Anne AnnePeter Peter Peter Peter Peter Peter Peter Peter Peter Peter Peter Peter Peter Peter Peter Peter Anne Anne Anne Anne Anne Anne Anne Anne Anne Anne Anne Anne Anne Anne Anne Peter Peter Peter Peter Peter Peter . . . . . . . . . . .

Page 17: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

JavaJava--Programm mit MultithreadingProgramm mit Multithreading

Zeit

main .....thread1 = new Thread()

thread2 = new Thread()thread1.start()

void run(){work1()work2()work3()

work4()work5()

}

thread2.start()

mainDoSomething()

mainWork()mainWork()end()

}

.

..

.

void run(){work1()

work2()work3()work4()

work5()work6()

}

thread1

thread2

Page 18: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

join() - Methode

sleep(int millis) - Methode

Um auf die Beendigung eines oder mehrerer Threads

zu warten, benutzt man die join() - Methode.

Ein Thread kann mit der sleep()-Methode für eine

vorbestimmte Zeit in den Zustand "not runnable"

versetzt werden.

…… weitere wichtige Methodenweitere wichtige Methoden

Page 19: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Implementierung als Unterklasse von ThreadImplementierung als Unterklasse von Threadpublic class SimpleThread extends Thread {

int lifeTime;

public SimpleThread( String name, int lifeTime ) {super( name );this.lifeTime = lifeTime;

}

public void run() {for ( int i=0; i<lifeTime; i++ ) {

try { this.sleep( 1000 );System.out.println( "Ich bin "+this.getName() );

}catch ( InterruptedException ie )

System.out.println(ie);}

}

}

Page 20: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

public class TestSimpleThread {

public static void main( String[] args ) {

SimpleThread t1 = new SimpleThread( "Andreas", 5 );

SimpleThread t2 = new SimpleThread( "Hanna", 5 );

SimpleThread t3 = new SimpleThread( "Anne", 3 );

t1.start();

t2.start();

t3.start();

System.out.println( "Ich bin main" );

}

}

Ich bin mainIch bin main

Ich bin AndreasIch bin Andreas

Ich bin HannaIch bin Hanna

Ich bin AnneIch bin Anne

Ich bin AndreasIch bin Andreas

Ich bin HannaIch bin Hanna

Ich bin AnneIch bin Anne

Ich bin AndreasIch bin Andreas

Ich bin HannaIch bin Hanna

Ich bin AnneIch bin Anne

Ich bin AndreasIch bin Andreas

Ich bin HannaIch bin Hanna

Ich bin AndreasIch bin Andreas

Ich bin HannaIch bin Hanna

maint1t2t3t1t2t3t1t2t3t1t2t1t2

Ausgabe:

Page 21: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

ThreadThread--BeispielBeispiel

public class TestSimpleThread {

public static void main( String[] args ) {

SimpleThread t1 = new SimpleThread( "Andreas", 5 );SimpleThread t2 = new SimpleThread( "Hanna", 5 );t1.start();t2.start();try {

t1.join(); // Warte auf den 1.Threadt2.join(); // Warte auf den 2.Thread

}catch ( InterruptedException ie ) {

System.out.println( ie );}System.out.println( "Ich bin main" );

} // end of main} // end of class

Ich bin AndreasIch bin Andreas

Ich bin HannaIch bin Hanna

Ich bin AndreasIch bin Andreas

Ich bin HannaIch bin Hanna

Ich bin AndreasIch bin Andreas

Ich bin HannaIch bin Hanna

Ich bin AndreasIch bin Andreas

Ich bin HannaIch bin Hanna

Ich bin AndreasIch bin Andreas

Ich bin HannaIch bin Hanna

Ich bin mainIch bin main

t1

t2

t1

t2

t1

t2

t1

t2

t1

t2

main

Page 22: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

garbage collector

garbage collector

Es gibt kein JavaEs gibt kein Java--Programm ohne Threads.Programm ohne Threads.

Java-Anwendung

Betriebssystem

Browser

Java-Applet Java-Appletmain-Thread

init-Thread init-Thread

Betriebssystem

setVisible(true)

event-dispatcher

GUI

Page 23: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Gliederung der VorlesungGliederung der Vorlesung

- Konzepte der Nebenläufigkeit

- Threads in Java

-- SynchronisationsproblemeSynchronisationsprobleme

- Klassische Lösungen

- Semaphoren

- Monitore

- Lebenszyklus eines Threads

Page 24: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Was ist das Problem mit Threads?Was ist das Problem mit Threads?

- es ist sehr einfach Threads in Java zu

programmieren

- es ist schwer Threads ohne Fehler zu

programmieren!

Was geschieht, wenn Threads

gemeinsame Variablen oder

Ressourcen benutzen?

Page 25: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

x=y

Threads mit gemeinsamen DatenThreads mit gemeinsamen DatenT1

x=y

T2

T1: x = x + 1;

T2:x = x * 2;

T2:y = y * 2;

public void run(){..x = x + 1;y = y + 1;

.}

paint();

public void run(){..x = x * 2;y = y * 2;

.}

paint();

paint(); T2:T1: y = y + 1;

3, 34, 38, 38, 68, 68, 7

x y

Page 26: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

SynchronisationsproblemeSynchronisationsprobleme

public class Asynchron extends Thread {

public static int zaehler = 0;

public void run() {

while ( zaehler<25 ) {

zaehler++;

System.out.print( this + " " );

System.out.println( zaehler );

}

}

public static void main( String args[] ) {

Thread t1 = new Asynchron();

Thread t2 = new Asynchron();

t1.start();

t2.start();

}

}

Klassenvariable

Gemeinsame

Variable für

alle Objekte

der Klasse

Asynchron.

Page 27: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

SynchronisationsproblemeSynchronisationsprobleme

public void run() {while ( zaehler<25 ) {

zaehler++;System.out.print( this + " " );System.out.println( zaehler );

}}

public void run() {while ( zaehler<25 ) {

zaehler++;System.out.print( this + " " );System.out.println( zaehler );

}}

zaehler 0

t1 t2

Page 28: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

SynchronisationsproblemeSynchronisationsprobleme

zaehler 6

t0 t1

public void run() {while ( zaehler<25 ) {

zaehler++;System.out.print( this + " " );System.out.println( zaehler );

}}

public void run() {while ( zaehler<25 ) {

zaehler++;System.out.print( this + " " );System.out.println( zaehler );

}}

78

Page 29: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

SynchronisationsproblemeSynchronisationsproblemeThread[Thread-0,5,main] 1Thread[Thread-0,5,main] 2Thread[Thread-0,5,main] 3Thread[Thread-0,5,main] 4Thread[Thread-0,5,main] 5Thread[Thread-0,5,main] 6Thread[Thread-1,5,main] Thread[Thread-0,5,main] 88Thread[Thread-0,5,main] 9Thread[Thread-0,5,main] 10Thread[Thread-0,5,main] 11Thread[Thread-0,5,main] 12Thread[Thread-0,5,main] 13Thread[Thread-0,5,main] 14Thread[Thread-0,5,main] 15Thread[Thread-0,5,main] 16Thread[Thread-0,5,main] 17Thread[Thread-0,5,main] 18Thread[Thread-0,5,main] Thread[Thread-1,5,main] 2020Thread[Thread-0,5,main] Thread[Thread-1,5,main] 2222Thread[Thread-0,5,main] Thread[Thread-1,5,main] 24Thread[Thread-0,5,main] 25

Page 30: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

SynchronisationsproblemeSynchronisationsprobleme

zaehler 24

t0 t1

public void run() {while ( zaehler<25 ) {

zaehler++;System.out.print( this + " " );System.out.println( zaehler );

}}

public void run() {while ( zaehler<25 ) {

zaehler++;System.out.print( this + " " );System.out.println( zaehler );

}}

Page 31: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

SynchronisationsproblemeSynchronisationsprobleme

zaehler 24

t0 t1

public void run() {while ( zaehler<25 ) {

zaehler++;System.out.print( this + " " );System.out.println( zaehler );

}}

public void run() {while ( zaehler<25 ) {

zaehler++;System.out.print( this + " " );System.out.println( zaehler );

}}

2526

Page 32: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

LLöösung:sung:

T1

public void run(){..x = x + 1;y = y + 1;

.}

paint();

T2

public void run(){..x = x * 2;y = y * 2;

.}

paint();

Kritischer Abschnitt

Kritischer Abschnitt

nur ein Thread im kritischen Abschnitt

Wechselseitiger Ausschluss muss gewährleistet werden.

Page 33: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

kritischer Abschnitt

Wechselseitiger Ausschluss muss gewährleistet werden,

wenn gemeinsame Ressourcen benutzt werden.

Kritische AbschnitteKritische Abschnitte

Page 34: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

simultaneous peripheral operations on line

Drucker-Spooler

Erster freier Platz der Warteschlange

QTail

Thread A

...adr = liest QTail

speichert Datei in adr

inkrementiert QTail

...

Thread B

...adr = liest QTail

speichert Datei in adr

inkrementiert QTail

...

Typisches Beispiel:

0 1 2 3 4

Page 35: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Klassisches Beispiel in der Literatur:

simultaneous peripheral operations on line

Drucker-Spooler

0 1 2 3

QTail

Thread A

...adr = liest QTail

speichert Datei in adr

inkrementiert QTail

...

Thread B

...adr = liest QTail

speichert Datei in adr

inkrementiert QTail

...

Unterbrechung

=4

Unterbrechung

4 5

44

Page 36: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Typisches Beispiel:simultaneous peripheral operations on line

Drucker-Spooler

0 1 2 3

QTail

Thread A

...adr = liest QTail

speichert Datei in adr

inkrementiert QTail

...

Thread B

...adr = liest QTail

speichert Datei in adr

inkrementiert QTail

...Unterbrechung

4 5

Kritischer Abschnitt

Unterbrechung

6

Page 37: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Gliederung der VorlesungGliederung der Vorlesung

- Konzepte der Nebenläufigkeit

- Threads in Java

- Synchronisationsprobleme

-- Klassische LKlassische Löösungensungen

- Semaphoren

- Monitore

- Lebenszyklus eines Threads

Page 38: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Kritische AbschnitteKritische AbschnitteKritische Abschnitte sind die Teile des Programms, in denen auf gemeinsam benutzten Speicher bzw. Ressourcen zugegriffen werden kann.

Wechselseitiger Ausschluss muss gewährleistet werden.

1. Unterbrechungen ausschalten

2. Variablen sperren

3. Strikter Wechsel

4. Petersons Lösung

5. Die TSL- Anweisung

Wie?

Page 39: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

1. Unterbrechungen ausschalten

Jedoch: Benutzerprozesse sollten nicht die Macht haben, alle Unterbrechungen auszuschalten.

Die Ausschaltung von Unterbrechungen ist ein Privileg des Betriebssystems.

Nicht geeignet als Ausschlussmechanismus für Benutzerprozesse.

disable_Interrupts();

kritischer_abschnitt();

enable_Interrupts();

Page 40: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

2. Variablen sperren

Warteschlange

Sperre = 0

Wenn Sperre = 0, ist die Warteschlange gesperrt

Wenn Sperre = 1, ist die Warteschlange nicht gesperrt

Nehmen wir an, zwei Threads möchten eine Warteschlange

gemeinsam benutzen.

Die Prozesse benutzen wiederum eine gemeinsame Variable, um den Zugriff auf die Warteschlange zu synchronisieren.

Page 41: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

2. Variablen sperren

Warteschlange

Sperre =

Thread A Thread B

if (Sperre == 0)

Sperre = 1;

kritischer

Abschnitt

wird

ausgeführt

else

warten....

if (Sperre == 0)

Sperre = 1;

kritischer

Abschnitt

wird

ausgeführt

else

warten....

Interrupt

0

Page 42: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

2. Variablen sperren

Warteschlange

Sperre =

Thread A Thread B

if (Sperre == 0)

Sperre = 1;

kritischer

Abschnitt

wird

ausgeführt

else

warten....

if (Sperre == 0)

Sperre = 1;

kritischer

Abschnitt

wird

ausgeführt

else

warten....

Interrupt

Interrupt

1

Page 43: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

2. Variablen sperren

Warteschlange

Sperre =

Thread A Thread B

if (Sperre == 0)

Sperre = 1;

kritischer

Abschnitt

wird

ausgeführt

else

warten....

if (Sperre == 0)

Sperre = 1;

kritischer

Abschnitt

wird

ausgeführt

else

warten....

Interrupt

1

Beide Prozesse können in ihren

kritischen Bereich

gleichzeitig eintreten.

Page 44: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

3. Strikter Wechsel

turn = 0

while ( true ) {

while ( turn != 0 );

critical_region();

turn = 1;

noncritical_region();

}

while ( true ) {

while ( turn != 1 );

critical_region();

turn = 0;

noncritical_region();

}

Warteschlange

Thread 0 Thread 1

Page 45: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

3. Strikter Wechsel

turn = 0

while ( true ) {

while ( turn != 0 );

critical_region();

turn = 1;

noncritical_region();

}

while ( true ) {

while ( turn != 1 );

critical_region();

turn = 0;

noncritical_region();

}

Warteschlange

Thread 0 Thread 1

Page 46: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

3. Strikter Wechsel

turn = 1

while ( true ) {

while ( turn != 0 );

critical_region();

turn = 1;

noncritical_region();

}

while ( true ) {

while ( turn != 1 );

critical_region();

turn = 0;

noncritical_region();

}

Warteschlange

Thread 0 Thread 1

Page 47: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

3. Strikter Wechsel

turn = 1

while ( true ) {

while ( turn != 0 );

critical_region();

turn = 1;

noncritical_region();

}

while ( true ) {

while ( turn != 1 );

critical_region();

turn = 0;

noncritical_region();

}

Warteschlange

Thread 0 Thread 1

Page 48: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

3. Strikter Wechsel

Leider erfordert diese Lösung einen strikten Wechsel zwischen den Prozessen.

while ( true ) {

while ( turn != 0 );

critical_region();

turn = 1;

noncritical_region();

}

while ( true ) {

while ( turn != 1 );

critical_region();

turn = 0;

noncritical_region();

}

turn = 1

Warteschlange

Thread 0 Thread 1

Erst wenn Thread B wieder in seinem kritischen Abschnitt gewesen ist, darf Thread A seinen kritischen Abschnitt wieder betreten.

Page 49: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

4. Petersons Lösung für zwei Prozessepublic class PetersonThread extends Thread {

static int turn = 0;static boolean[] ready = { false, false };

int id, other;

public PetersonThread( int id ){this.id = id;this.other = 1-id;

}

public void run() {while(true){

ready[id] = true;turn = other;while( ready[other] && turn==other );critical_region();ready[id]=false;noncritical_region();

}}

}

Page 50: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

4. Petersons Lösung für zwei Prozesse

ready

0 1

false false turn =

public void run() {

while ( true ) {

ready[0] = true ;

turn = 1;

while(ready[1] && turn==1);

{ //kritischer Abschnitt }

ready[0] = false;

{ //Rest des Programms }

}

}

public void run() {

while ( true ) {

ready[1] = true ;

turn = 0;

while(ready[0] && turn==0);

{ //kritischer Abschnitt }

ready[1] = false;

{ //Rest des Programms }

}

}

0

Thread 0 Thread 1

Page 51: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

4. Petersons Lösung für zwei Prozesse

ready

0 1

true false turn =

public void run() {

while ( true ) {

ready[0] = true ;

turn = 1;

while(ready[1] && turn==1);

{ //kritischer Abschnitt }

ready[0] = false;

{ //Rest des Programms }

}

}

public void run() {

while ( true ) {

ready[1] = true ;

turn = 0;

while(ready[0] && turn==0);

{ //kritischer Abschnitt }

ready[1] = false;

{ //Rest des Programms }

}

}

1

Thread 0 Thread 1

Page 52: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

4. Petersons Lösung für zwei Prozesse

ready

0 1

true turn =

public void run() {

while ( true ) {

ready[0] = true ;

turn = 1;

while(ready[1] && turn==1);

{ //kritischer Abschnitt }

ready[0] = false;

{ //Rest des Programms }

}

}

public void run() {

while ( true ) {

ready[1] = true ;

turn = 0;

while(ready[0] && turn==0);

{ //kritischer Abschnitt }

ready[1] = false;

{ //Rest des Programms }

}

}

0false

Thread 0 Thread 1

Page 53: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

5. TSL-Anweisung

Insbesondere Mehrprozessorrechner haben TSL-Anweisungen.

TSL RX, LOCK Test and Set Lock

Wenn die CPU eine TSL-Anweisung im Speicher ausführt, wird der Speicherbus gesperrt, bis er fertig ist.

Lösung mit Hardware-Unterstützung.

Page 54: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Peterson + TSL-Anweisung

while ( true ) {

flag[0] = true ;

turn = 1;

while(flag[1] && turn==1);

{ //kritischer Abschnitt }

flag[0] = false;

{ //Rest des Programms }

}

while ( true ) {

flag[1] = true ;

turn = 0;

while(flag[0] && turn==0);

{ //kritischer Abschnitt }

flag[1] = false;

{ //Rest des Programms }

}

P0 hat eine höhere Priorität P1 hat eine niedrigere Priorität

Prioritätsumkehrproblem

flag

0 1

false false turn = 0

Page 55: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Peterson + TSL-Anweisung

while ( true ) {

flag[0] = true ;

turn = 1;

while(flag[1] && turn==1);

{ //kritischer Abschnitt }

flag[0] = false;

{ //Rest des Programms }

}

while ( true ) {

flag[1] = true ;

turn = 0;

while(flag[0] && turn==0);

{ //kritischer Abschnitt }

flag[1] = false;

{ //Rest des Programms }

}

P0 hat eine höhere Priorität P1 hat eine niedrigere Priorität

Prioritätsumkehrproblem

flag

0 1

true true turn = 1

Page 56: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Peterson + TSL-Anweisung

Der Peterson-Algorithmus und die TSL-Lösung haben

den Nachteil, dass aktives Warten erforderlich ist.

1. CPU-Zeit Verschwendung

2. PrioritätsumkehrproblemProbleme

Prioritätsumkehrproblem

Obwohl P0 eine höhere Priorität als P1 hat, muss er

immer länger als P1 warten, um in seinen kritischen

Abschnitt eintreten zu können.

Page 57: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Schlafen und AufweckenSleep und Wakeup

Eine Alternative zum aktiven Warten ist:

Schlafen gehen, anstatt CPU-Zeit zu verschwenden.

Aber ein schlafender Prozess kann sich selber

nicht aufwecken. D.h. er braucht einen

entsprechenden Partner, der ihn wieder aufweckt.

Page 58: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Gliederung der VorlesungGliederung der Vorlesung

- Konzepte der Nebenläufigkeit

- Threads in Java

- Synchronisationsprobleme

- Klassische Lösungen

-- SemaphorenSemaphoren

- Monitore

- Lebenszyklus eines Threads

Page 59: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Semaphoren

Semaphoren sind eine der wichtigsten Datenstrukturen, die für die Synchronisation von Prozessen in fast allen Betriebssystemen zur Verfügung gestellt werden.

Semaphoren als eine Lösung für Prozesssynchronisation wurde von Edsger W. Dijkstra 1965 konzipiert.

Semaphoren haben folgende Komponenten:

- ein Zähler

- eine acquire-Operation

- eine release-Operation

Page 60: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Semaphoren

Der Inhalt der Semaphoren wird nur mit

Hilfe der Operationen acquire und release

verändert.

Die aquire- und release-Operationen sind

atomare Operationen, die einen Thread

eventuell wecken oder zum Schlafen

schicken.

Page 61: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Lösung mit Semaphoren

Semaphore sem = new Semaphore(1);. . .public void run(){

. . .sem.acquire();kritische_abschnitt();sem.release();. . .

}. . .

Ab Java 1.5 ist eine Semaphor-Klasse in dem Paket java.util.concurrent enthalten.

Allgemeine Verwendung eines einfachen binären

Semaphors oder mutex.

Page 62: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Probleme mit SemaphorenProbleme mit Semaphoren

s.release();

. . .

// Kritischer Abschnitt

. . .

s.acquire();

Mehrere Threads können in den kritischen Abschnitt eintreten.

s.acquire();

. . .

// Kritischer Abschnitt

. . .

s.acquire();

Ein Deadlockfindet innerhalb des Threads statt.

Folgende einfache Fehler werden oft vom Programmierer gemacht:

Page 63: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Probleme mit SemaphorenProbleme mit Semaphoren

S1.acquire();

S2.acquire();

.

.

.

S2.release();

S1.release();

T0 T1

S2.acquire();

S1.acquire();

.

.

.

S1.release();

S2.release();

Folgende Fehler sind im Programm schwer zu erkennen, weil die Probleme nur bei bestimmten Ausführungssequenzen auftreten.

S1.acquire();

S2.acquire();

T0:

T1:

T0:

T1:

S2.acquire();

S1.acquire();

Wartet!

Wartet!

Verklemmung!Verklemmung!

Page 64: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Gliederung der VorlesungGliederung der Vorlesung

- Konzepte der Nebenläufigkeit

- Threads in Java

- Synchronisationsprobleme

- Klassische Lösungen

- Semaphoren

-- MonitoreMonitore

- Lebenszyklus eines Threads

Page 65: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

MonitoreMonitore

Gemeinsame Daten

Sind abstrakte Datentypen (ADT) Ta Tb Tc Td

.

.

.

Operationen

Ein Monitor garantiert gegenseitigen Ausschluss des Zugriffs auf die Daten innerhalb des Monitors.

Nur durch die Operationen des Monitors dürfen die inneren Daten geändert werden. Nur ein Thread darf

zu einem bestimmten Zeitpunkt innerhalb des Monitors aktiv sein.

Page 66: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

MonitoreMonitore

To

Das Objekt ist blockiert

T3 T2 T4 T8 T1

Besitzer des Objektes

Nur ein Thread darf zu einem bestimmten Zeitpunkt innerhalb des Monitors aktiv sein.

Monitore können in Java als Klassen mit synchronized-

Methoden und geeigneter Verwendung der wait-, notify- und

notifyAll-Methoden realisiert werden.

Page 67: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Das Das synchronizedsynchronized--SchlSchlüüsselwortsselwort in Javain Java

In Java ist jede Instanz der Klasse java.lang.Objectmit einer Sperrvariable verknüpft.

Diese Sperre entspricht einem booleschen Semaphor.

. . .synchronized ( nums ) {

for ( int i=0; i<nums.length; i++ ) {if (nums[i] < 0)

nums[i] = -nums[i];}

}. . .

Beispiel:

. . .synchronized (Objektvariable) {

. . .}. . .

Page 68: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Das Das synchronizedsynchronized--SchlSchlüüsselwortsselwort in Javain Java

T1

. . .synchronized (A) {

. . .synchronized (B) {

. . .}

}. . .

T2

. . .synchronized (B) {

. . .synchronized (A) {

. . .}

}. . .

Verklemmung!

Page 69: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

MonitoreMonitore

Gemeinsame Daten

Ta Tb Tc Td

Bedingungsvariablen

b1

b2

b3

T2 T1 T3

.

.

.

Warteschlangen, die mit Bedingungsvariablen verbunden sind.

Sprachen mit Monitorkonzept

Concurrent Pascal

C#

Erlang

Ada

Squeak Smalltalk

Java

T7

T4 T5

Page 70: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

WaitWait undund NotifyNotify

Die wait() und notify()-Methoden können nur innerhalb eines synchronized-Blockes stehen.

Aufruf der wait-Methode

- Der Thread gibt die Objektschlüssel zurück.

- Der Thread selber geht in den blockierten Zustand.

- Der blockierte Thread wird in die Warteschlangedes Objektes gestellt.

Aufruf der notify-Methode

- Ein beliebiger Thread aus der Warteschlange des Objektes wird gewählt.

- Der gewählte Thread wird in den Entry-Set gestellt.

- Der Zustand des Threads wird auf runnable gesetzt.

Page 71: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Monitore in JavaMonitore in Java

To

Das Objekt ist blockiert

T3

Besitzer des Objektes

T2 T4T8 T1T8 T1

Entry-Set Wait-Set

Hier warten die Threads auf den Lock des Objektes

Hier warten die Threads auf ein Notify

wait

Page 72: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Monitore in JavaMonitore in Java

To

Das Objekt ist blockiert

T3

Besitzer des Objektes

T2 T4T8 T1T8 T1

Entry-Set Wait-Set

Hier warten die Threads auf den Lock des Objektes

Hier warten die Threads auf ein Notify

notify

Page 73: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Leser/SchreiberLeser/Schreiber--ProblemProblem

public class Database implements ReadWriteLock {

private int readerCounter;

private boolean Writing;

public Database(){

readerCounter = 0;

Writing = false;

}

. . .

}//end of class Database

- beliebig viele Threads dürfen gleichzeitig lesen

- nur ein Thread darf schreiben (keiner darf lesen)

Page 74: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Leser/SchreiberLeser/Schreiber--ProblemProblempublic class Database implements ReadWriteLock {

. . .

public synchronized void acquireReadLock() {

while( Writing == true ){

try {

wait();

} catch (InterruptedException e) {. . .}

}

++readerCounter;

}

public synchronized void acquireWriteLock() {

while( readerCounter>0 || Writing==true ){

try {

wait();

} catch (InterruptedException e) {. . .}

}

Writing = true;

}

}//end of class Database

Page 75: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Leser/SchreiberLeser/Schreiber--ProblemProblem

public class Database implements ReadWriteLock {

. . .

public synchronized void releaseReadLock() {

--readerCounter;

/* der letzte Leser meldet sich */

if ( readerCounter==0 )

notify();

}

public synchronized void releaseWriteLock() {

Writing = false;

notifyAll();

}

. . .

}//end of class Database

Verhungern!

Page 76: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

Gliederung der VorlesungGliederung der Vorlesung

- Konzepte der Nebenläufigkeit

- Threads in Java

- Synchronisationsprobleme

- Klassische Lösungen

- Semaphoren

- Monitore

-- Lebenszyklus eines ThreadsLebenszyklus eines Threads

Page 77: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

NewNew

new Thread()

rechenrechen--bereitbereit

TotTot

start()

stop()

blockiertblockiertresume()

stop()

suspend()

LebensLebens--Zyklus einesZyklus eines ThreadThreadss JDK 1.1JDK 1.1

stop()

Deadlock-Probleme!

Page 78: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

kritischer Abschnitt

Verklemmungsprobleme

stop

Verklemmung!

Page 79: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

rechenrechen--bereitbereit

new Thread()

rechnendrechnend

MonitorMonitor--blockiertblockiert

start()tottot

LebensLebens--Zyklus einesZyklus eines ThreadThreadss JDK 1.2JDK 1.2

wartendwartend

schlafendschlafendIOIO--

blockiertblockiert

neuneu

yield()

SchedulingScheduling

terminiert

wait()

notify()

interrupt

interrupt

Frei-gegeben

Monitorbesetzt

Timeout IO-Operation

IO-End

sleep()

Page 80: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

java.util.concurrentjava.util.concurrent

- Klassen mit unteilbarem (atomarem) Zugriff

AtomicBoolean, AtomicInteger, AtomicIntegerArray,AtomicLong, AtomicReference, usw.

- Erweiterte Sammlungsklassen für Threads

ConcurrentLinkedQueue, ConcurrentHashMap, usw.

- Semaphor-Klasse

- Klassen für ThreadPools

- Erweiterte Klassen für Sperren und Synchronisation

Page 81: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

LiteraturLiteratur

Operating System Concepts with Java. 7th Edition. 2007

Silverschatz, Galvin und Gagne

Java Threads. 3th Edition. 2004

Scott Oaks & Henry Wong.

Page 82: Nebenläufigkeit in Java print - inf.fu-berlin.de · Java-Applet Java-Applet main-Thread init-Thread init-Thread Betriebssystem setVisible(true) event-dispatcher GUI. Gliederung der

FragenFragen