Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen

Ähnliche Dokumente
Das Monitorkonzept Brinch-Hansen

parallele Prozesse auf sequenziellen Prozessoren Ein Process ist ein typisches Programm, mit eigenem Addressraum im Speicher.

Objektorientierte Programmierung

Ausnahmebehandlung in Java

Parallele Prozesse. Prozeß wartet

Synchronisation in Java. Invisible Web

Nebenläufige Programmierung I

Beispiel für überladene Methode

Nebenläufigkeit mit Java

Lebenszyklus von Threads

Aufgabenblatt 8 Musterlösung

Vorlesung Informatik II

Algorithmen und Datenstrukturen II

Testen nebenläufiger Objekte

Verteilte Systeme CS5001

Nebenläufige Programmierung I

Aufgabe 9 Threads [12]

Programmierung mit Threads in Java

Prozesszustände (1a)

Praktikum aus Softwareentwicklung 2, Stunde 5

Javakurs für Fortgeschrittene

Wirtschaftsinformatik II Sommersemester Lo sungshinweise zu den Ü bungen P. Mandl, M. Dolag, B. Rottmüller, et al.

OOP: Nebenläufigkeiten Threads. Dipl.-Inform. Arnold Willemer

(b.) Welche Möglichkeit gibt es, die Methode run so zu verändern, dass Bora Bora IMMER zuletzt ausgegeben wird?

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Philipp Güttler Progwerkstatt Letzte Änderung: Enums, Interfaces, Generics und Threads

5. Threads, Serverprozesse und Benachrichtigungen

Java Concurrency Utilities

Laborskript Verteilte Systeme

Klausur Software-Entwicklung September 00

Softwaretechnik 1 Übung 5

Einführung in die Programmierung Blockkurs Java

Info B VL 17: Deadlocks

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Informatik B. Vorlesung 8 Synchronisierung von Threads. Dr. Ralf Kunze

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Java I Vorlesung Nebenläufigkeit

Fachhochschule Wedel 31. Januar 2004 Prof. Dr. Uwe Schmidt

Informatik II. Semesterklausur

Einführung in die Informatik 1

Lösungsvorschläge zur Nachklausur zum Kurs 1618 Sommersemester 2001 am

Thread-Konzept in objektorientierten Programmiersprachen. Threads. Threads in Java

Einführung in die Informatik 1

Übung zu Grundlagen der Betriebssysteme. 10. Übung

Einführung in die Programmierung mit Java

Nebenläufigkeit mit Java

Verteilte Systeme. 2. Die Client-Server-Beziehung und daraus resultierende Techniken. 2.2 Nebenläufigkeitstechniken in Java

Beteiligte Typen (Auszug)

16. Parallelität: Threads

Kapitel 5. Monitore und Synchronisationsbedingungen

JJ Prozesse und Nebenläufigkeit

System.out.println("TEXT");

Muster nebenläufiger Programmierung. concurrent Packet von Java. Alois Schü;e AOSD 1

Nebenläufige und verteilte Programme CS2301

Einstieg in die Informatik mit Java

Programmieren II. Nebenläufigkeit. Vorlesung 9. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester Threads. Kritische Bereiche

Einstieg in die Informatik mit Java

Einführung Verteilte Systeme - Java Threads I -

Kapitel 6. Verklemmungen (Deadlocks)

Überblick. Verteilte Systeme - Übung. Was ist ein Thread? Threads in Java. Multithreading in Java Threads Synchronisation Koordinierung

II.4.2 Abstrakte Klassen und Interfaces - 1 -

Dr. Monika Meiler. Inhalt

Vorkurs Informatik WiSe 15/16

Liste Programmieren Java Überblick

Einführung Verteilte Systeme - Java Threads III -

16. Parallelität: Threads

Deadlocks Wait/Notify Reflections JavaBeans. Programmieren II. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester / 33

Nebenläufige und verteilte Programme CS2301

Programmieren II. Verklemmungen. Vorlesung 10. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester Deadlocks.

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

Algorithmen implementieren. Implementieren von Algorithmen

Tag 8 Repetitorium Informatik (Java)

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

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

Interface. So werden Interfaces gemacht

Institut fu r Informatik

Nebenläufige und verteilte Programme CS2301

12. Threads in Java. Sequentielle Abarbeitung (2) Beispiel: Thread (1) Sequentielle Abarbeitung (1)

Institut für Informatik. Endterm Klausur zu Informatik I 20. Februar 2010

Prozeßorientierter Simulator mit Java

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Zur Erinnerung: Threads. Threadverwaltung. Threads: Prioritäten. Beispiel Flugbuchungsprogramm. Nichtdeterminismus

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Aufgabenblatt 6 Musterlösung

Parallele Prozesse Prozeß Parallele Prozesse verzahnte Prozesse Nebenläufige Prozesse: Threads Vorlesung Software-Entwicklung / Folie 131 Ziele:

UML / Fujaba. Generierung von Java-Quellcode aus UML-Diagrammen. Marcel Friedrich

Software Entwicklung 1. Rekursion. Beispiel: Fibonacci-Folge I. Motivation. Annette Bieniusa / Arnd Poetzsch-Heffter

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

Threads Kritische Bereiche Reales Beispiel Deadlocks Wait/Notify. Programmieren II. Martin Schultheiß. Hochschule Darmstadt Sommersemester 2011

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen

Variablenarten. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

12 Abstrakte Klassen, finale Klassen und Interfaces

Vorlesung Informatik II

Allgemeine Hinweise:

PROG 2: Einführung in die Programmierung für Wirtschaftsinformatiker

Transkript:

Thread-Synchronisation in in Java Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen

Die Klasse Thread Die Die Klasse Thread gehört zur zur Standardbibliothek von von Java. Zur Zur Generierung eines weiteren Kontrollflusses muss zunächst ein ein Objekt dieser Klasse erzeugt werden: Thread worker = new new Thread (); (); Dieses kann dann konfiguriert werden (Setzen von von initialer Priorität, Namen etc.) etc.) und und anschließend zum zum Ablauf gebracht werden. Durch Aufruf der der Methode start wird wird ein ein auf auf den den Daten im im Thread- Objekt basierender Kontrollfluß initiiert und und durch Aufruf der der Methode run runaktiviert. Die Die Methode run runmuss für für erweiterte Thread-Klassen neu neu definiert werden. Die Die voreingestellte Implementierung ist ist wirkungslos.

Beispiel: Die Klasse PingPong class PingPong extends Thread { String word; int delay; PingPong (String whattosay, int delaytime) { word = whattosay; delay = delaytime; public void run() { try { for (;;) { System.out.print(word+ ); sleep(delay); catch(interruptedexception e) { return; public static void main (String[] args) { new PingPong ( ping,33).start(); new PingPong ( PONG,100).start();

Das Interface Runnable Alternativ können Threads durch Implementierung des des Interfaces Runnable programmiert werden: class class Simple implements Runnable { public void void run() run() {...... Threaderzeugung Runnable s = new new Simple(); new new Thread(s).start(); Vorteil: Die Die Klasse Simple kann auch andere Klassen erweitern, was was als als Erweiterung der der Thread-Klasse nicht möglich wäre.

Threaderzeugung in in 4 Schritten 1. 1. Definition einer neuen Klasse als als Erweiterung der der Thread-Klasse oder als als Implementierung des des Runnable-Interfaces 2. 2. Definition einer Methode run in in der neuen Klasse Festlegung des des Thread-Anweisungsteils 3. 3. Erzeugung einer Klasseninstanz mit der new- Anweisung 4. 4. Starten des Threads mit der Methode start.

Thread-Life Cycle mögliche Ursachen: Aufruf von sleep-methode Aufruf von wait-methode Warten auf Ein-/Ausgabe

Wechselseitiger Ausschluss als synchronized deklarierte Methoden: Wird eine solche Methode aufgerufen, wird eine Sperre gesetzt und es kann keine andere als synchronized deklarierte Methode ausgeführt werden, solange die Sperre gesetzt ist. Bsp: class Account { private double balance; public Account (double initialdeposit) { balance = initialdeposit; public synchronized double getbalance () { return balance; public synchronized void deposit (double amount) { balance += amount; Eine Klasse, deren extern aufrufbare Klassenmethoden alle mit synchronized versehen sind, entspricht somit weitgehend dem Monitorkonzept.

Wechselseitiger Ausschluß das synchronized Konstrukt: synchronized (<expr>) <statement> expr wird zu einem Objekt (oder Array) ausgewertet, das für einen weiteren Zugriff geschlossen werden soll. Falls das Schloss offen und damit der Eintritt erlaubt ist, wird statement ausgewertet. Bsp: Alle Elemente eines Feldes sollen nicht negativ werden. public static void abs(int[] values) { synchronized(values) { for (int i=0; i<values.length; i++) { if (values[i] < 0) values[i] = -values[i];

Beispiel: Producer-Consumer public class Producer/Consumer extends Thread { private CubbyHole cubbyhole; private int number; public Producer/Consumer (CubbyHole c, int number) { cubbyhole = c; this.number = number; public void run() { int value = 0; public void run() { for (int i = 0; i < 10; i++) { value = cubbyhole.get(number); for (int i = 0; i < 10; i++) { cubbyhole.put(number, i); try { sleep((int)(math.random() * 100)); catch (InterruptedException e) {

public class CubbyHole { private int contents; private boolean available = false; Ein-Platz-Puffer -1. Ansatz - public synchronized int get (int who) { if (available == true) { available = false; System.out.println("Consumer " + who + " got: " + contents); return contents; public synchronized void put (int who, int value) { if (available == false) { contents = value; available = true; System.out.println("Producer " + who + " put: " + contents);

Bedingte Synchronisation Monitorkonzept nach Lampson/Redell (1980) Die Klasse Object enthält Methoden wait zum Blockieren von Threads notify zum Reaktivieren des am längsten wartenden Threads notifyallzum Reaktivieren aller wartenden Threads die von allen Klassen ererbt werden. Es gibt keine Bindung an eine Bedingungsvariable, jedoch dürfen wait und notify nur in synchronized- Klassenmethoden vorkommen. Im Unterschied zu dem im Monitorkonzept von Hoare verwendeten signal führt notify nicht zur unmittelbaren Ausführung des reaktivierten Threads, sondern lediglich zu seiner Einreihung in die Warteschlange der auf die Ausführung einer synchronisierten Methode wartenden Prozesse. notify ist gegenüber signal weniger fehleranfällig und erlaubt eine einfachere Warteschlangenverwaltung.

Standardschemata Bedingung abwarten: synchronized dowhencondition () { while (!condition) wait();... Aktion bei erfüllter Bedingung... Bedingung signalisieren: synchronized changecondition () {... Änderung von Werten, Bedingung erfüllen... notify();

public class CubbyHole { private int contents; private boolean available = false; Ein-Platz-Puffer public synchronized int get (int who) { while (available == false) { try { wait(); catch (InterruptedException e) { available = false; System.out.println("Consumer " + who + " got: " + contents); notifyall(); return contents; public synchronized void put (int who, int value) { while (available == true) { try { wait(); catch (InterruptedException e) { contents = value; available = true; System.out.println("Producer " + who + " put: " + contents); notifyall();

Deadlocks Synchronisierte Methoden eines Objektes können beliebige andere Methoden aufrufen (synchronisierte und nicht synchronisierte, desselben oder anderer Objekte) mögliche Ursachen für Deadlocks synchronisierte Methoden rufen sich gegenseitig auf Threads benötigen Locks auf mehrere Objekte irregulär terminierende Threads Jave hat keine Mechanismen, um Deadlocks zu verhindern oder aufzulösen.