Nebenläufigkeit mit Java

Ähnliche Dokumente
Nebenläufigkeit mit Java

Übung zu Grundlagen der Betriebssysteme. 10. Übung

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

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

Parallele Prozesse. Prozeß wartet

Kapitel 5. Monitore und Synchronisationsbedingungen

Synchronisation in Java. Invisible Web

Vorlesung Informatik II

Javakurs für Anfänger

Ausnahmebehandlung in Java

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

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

5. Threads, Serverprozesse und Benachrichtigungen

Das Monitorkonzept Brinch-Hansen

Praktikum aus Softwareentwicklung 2, Stunde 5

Verteilte Systeme CS5001

Java I Vorlesung Nebenläufigkeit

Nebenläufige Programmierung in Java: Threads

Ausgewählte Implementierungsprobleme

Java Concurrency Utilities

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

Parallele und funktionale Programmierung Wintersemester 2015/ Übung Abgabe bis , 10:00 Uhr

Überblick. Java Collections & Maps Threads Synchronisation Koordinierung. MW-Übung (WS11/12) Java Collections & Maps 2 1

Überblick. Generische Datenstrukturen. Traversieren von Datenstrukturen. Package: java.util

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Dr. Monika Meiler. Inhalt

Monitore. Klicken bearbeiten

Java Threads. von Gerhart Mende und Awad Fuad. Fuad Awad & Gerhart Mende ProSeminar parallele Programmierung 1

Versuchsziele Konzepte der parallelen Programmierung am Beispiel von Threads anwenden können. Einbau von Kontrollmechanismen mittels Semaphore.

Threads In dieser Übung beschäftigen wir uns mit der Realisierung von Threads in Java.

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

Java Schulung (Java 2 Java Development Kit 5 / 6)

Beispiel für überladene Methode

#define N 5 // Anzahl der Philosophen. while (TRUE) { // Der Philosoph denkt

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

Kapitel 10. Programmierkurs. Grundlagen von Exceptions Behandlung von Exceptions

leave: mov flag, 0 ; 0 in flag speichern: Lock freigeben ret

Algorithmen und Datenstrukturen II

Threading. Arthur Zaczek. Aug 2015

System.out.println("TEXT");

Prozesse und Threads. Saalübung Informatik II SS Threads erzeugen. Prozesse und Threads. Threads, Monitore und Semaphore

Informatik B - Objektorientierte Programmierung in Java. Vorlesung 21: Threads 2. Inhalt

Javakurs für Anfänger

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

2.2 Prozesse in Java

Kapitel 4. Monitore und wechselseitiger Ausschluss

Threads - und wie sie in Java implementiert sind. Vortrag von Lukas Klimmasch, Stefan Lang und Ralf Schmidt Jena, den

Einstieg in die Informatik mit Java

Mobile und Verteilte Datenbanken

Kapitel 10. Programmierkurs. Grundlagen von Exceptions Behandlung von Exceptions

Motivation. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 20: Threads. Inhalt. Ein Beispiel zur Motivation

Gegenseitiger Ausschluss 102

Einführung Verteilte Systeme - Java Threads III -

Linux Prinzipien und Programmierung

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

Methoden und Wrapperklassen

PThreads. Pthreads. Jeder Hersteller hatte eine eigene Implementierung von Threads oder light weight processes

Versuchsziele. Grundlagen. Überblick: FB Automatisierung und Informatik Betriebssysteme Thema: Bounded-Buffer-Problem. 3.

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Klausur Software-Entwicklung September 00

Universität Karlsruhe (TH)

Java Einführung Methoden. Kapitel 6

8.6 Visualisierung der Sortieralgorithmen

JJ Prozesse und Nebenläufigkeit

Verbessertes Konzept: Monitore

Javakurs für Anfänger

JAVA - Methoden - Rekursion

Programmieren in Java -Eingangstest-

Klausurvorbereitung VS1 (Prof. Brecht) (B0rg Edition)

Prozesse. Prozesse sind Programme. Prozesse können aus Unterprozessen bestehen. Prozesshierarchie Unterprozesse Threads

Betriebssysteme. Vorlesung im Herbstsemester 2010 Universität Mannheim. Kapitel 6: Speicherbasierte Prozessinteraktion

Javakurs für Anfänger

FAKULTÄT FÜR INFORMATIK

Einführung in die Programmierung Blockkurs Java

Nebenläufige und verteilte Programme CS2301

Javakurs für Anfänger

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Arbeitsblätter für die Lehrveranstaltung OOP JAVA 1

Vorlesung Informatik II

9. Vorlesung Betriebssysteme

Java Solutions. Programmier- und Architekturlösungen für die Java-Plattform. Bearbeitet von Markus Kopp, Gerhard Wilhelms

Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 08. Oktober Klausur II

Einführung in die Informatik 1

Algorithmen und Programmierung IV: Nichtsequentielle Programmierung. Robert Tolksdorf. Freie Universität Berlin

VS4 Slide 1. Verteilte Systeme. Vorlesung 4 vom Dr. Sebastian Iwanowski FH Wedel

Javakurs für Anfänger

Java Real-Time Specification

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

Javakurs für Anfänger

Java - Programmierung - Prozedurale Programmierung 1

Nebenläufige Programmierung I

Softwarelösungen: Versuch 4

Einführung in die Informatik 1

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

Synchronisationsmodul - Prozesse

Name: Matrikelnr : Aufgabe 1: (ca. 8 Punkte )

Übung Betriebssysteme 11

14 Abstrakte Klassen, finale Klassen, Interfaces

Javakurs für Anfänger

Transkript:

Nebenläufigkeit mit Java Einheit 03: Synchronisation Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme

Heutige Agenda Synchronisation von Threads Locks Java Monitor-Konzept Lock Freigabe Zusammenspiel zwischen wait(), notify() bzw. notifyall() Weitere Aspekte Monitore sind reentrant Warum nicht alles Synchronisieren? Deadlocks Praxis: Parkhaus Philosophen-Problem Lernziele Das Java Thread-Konzept kennenlernen und verstehen Threads mittels Monitoren synchronisieren können Java-Threads in weiteren Übungen vertiefen 25.01.2016 Nebenläufigkeit mit Java 03: Synchronisation - Lorenz Schauer 2

Beispiel zu ReentrantLock (Letzte Stunde) import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; public class Test { public static void main(string[] args) { final Lock lock = new ReentrantLock(); Runnable r = new Runnable() { int x=0; int y=2; boolean flag = true; @Override public void run() { while ( flag ) { lock.lock(); ReentrantLock implementiert Iface Lock Mittels Lock lässt sich ein krit. Bereich markieren Beginn mit: lock() x=x+2; y++; lock.unlock(); if ( x==y){ System.out.println( "Fertig"); flag=false; ; new Thread( r ).start(); new Thread( r ).start(); Ende mit: unlock() 25.01.2016 Nebenläufigkeit mit Java 03: Synchronisation - Lorenz Schauer 3

Monitore: Werden implizit durch die JVM erstellt Werden durch eine automatisch verwaltete Sperre realisiert Jedes Objekt verfügt über eine Sperre (Lock) Eintrittspunkte der Monitore müssen mit dem Schlüsselwort synchronized markiert sein Für Klassenmethoden Bsp.: public synchronized static void doit(){ Für Objektmethoden Bsp.: public synchronized void makeit(){ Für Blöcke Das Java Monitor-Konzept Bsp.: synchronized (objmitmonitor){ Ein solcher Eintrittspunkt kann nur betreten werden, wenn das Lock verfügbar ist. Ansonsten muss der Thread warten, solange bis das Lock verfügbar ist. 25.01.2016 Nebenläufigkeit mit Java 03: Synchronisation - Lorenz Schauer 4

Das Java Monitor-Konzept Ein freies Lock wird beim Betreten einer synchronized Methode/Block durch den aufrufenden Thread belegt (oder gehalten) Daraufhin kann kein anderer Thread mehr eine synchronisierte Methode des Objekts betreten (solange bis das Lock wieder freigegeben wird) Die statische Methode Thread.holdsLock() zeigt an, ob der aktuelle Thread das Lock hält. Ein gehaltenes Lock wird freigegeben, wenn: die synchronisierte Methode verlassen wird eine Ausnahme erfolgt ein wait() Aufruf getätigt wird. 25.01.2016 Nebenläufigkeit mit Java 03: Synchronisation - Lorenz Schauer 5

Lock Freigabe Durch Ausnahme (Exception) Lock wird bei einer unbehandelten RuntimeException in einer synchronized Methode/Block automatisch durch JVM freigegeben Da bei einer Exception der Block automatisch verlassen wird Durch Aufruf von wait() Thread beendet die Abarbeitung Geht in den Blocked Zustand Reiht sich in die Warteschlange des Objekts ein Das Lock wird freigegeben Der Thread wartet nun auf eine Benachrichtigung durch (notify() oder notifyall()), dass er wieder weiterabreiten darf Wartende Threads können auch durch einen Interrupt unterbrochen werden Daher: throws InterruptedException (Muss abgefangen werden!) Aufruf von wait(), notify() oder notifyall() nur möglich, wenn Lock gehalten wird! Ansonsten Laufzeitfehler: IllegalMonitorStateException 25.01.2016 Nebenläufigkeit mit Java 03: Synchronisation - Lorenz Schauer 6

Zusammenspiel zwischen wait(), notify() und notifyall() Zusammenfassung der Methoden: void wait() throws InterruptedException Thread wartet an dem aufrufenden Objekt darauf, dass er nach einem notify() bzw. notifyall() weiterarbeiten kann. void wait( long timeout ) throws InterruptedException Wartet auf ein notify()/notifyall() maximal aber eine gegebene Anzahl von Millisekunden. Nach Ablauf dieser Zeit ist er wieder rechenbereit. void wait( long timeout, int nanos ) throws InterruptedException Etwas spezifischer als vorher void notify() Weckt einen beliebigen Thread auf, der an diesem Objekt wartet und sich wieder um das Lock bemühen kann. Erhält er das Lock, kann er die Bearbeitung fortführen. void notifyall() Benachrichtigt alle Threads, die auf dieses Objekt warten. Hinweis: notify() bzw. notifyall() i.d.r., wenn aufrufender Thread dann auch das Lock freigibt (also am Ende eines synchronized Blocks) Sonst werden die Threads zwar aufgeweckt, aber das Lock ist immer noch vom aktuellen Thread belegt ( signal and continue -Prinzip) 25.01.2016 Nebenläufigkeit mit Java 03: Synchronisation - Lorenz Schauer 7

Zusammenspiel zwischen wait(), notify() und notifyall() Allgemeines Beispiel zum Zusammenspiel zwischen wait() und notify() public class MeinKlasse{ private Data state; public synchronized void op1() throws InterruptedException { while (!cond1) wait(); // modify monitor state notify(); // or notifyall(); public synchronized void op2() throws InterruptedException { while (!cond2) wait(); // modify monitor state notify(); // or notifyall(); Die while-schleife wird deshalb gebraucht, da bei Fortführung die Synchronisationsbedingung nicht notwendigerweise gelten muss! Ein einfaches if kann evtl. nicht ausreichen 25.01.2016 Nebenläufigkeit mit Java 03: Synchronisation - Lorenz Schauer 8

Konkretes Beispiel: Erzeuger-Verbraucher public class Speicher { private double[] speicher; private int pointer; private int size; private Random r = new Random(); public Speicher(double[] speicher){ this.speicher = speicher; this.size = speicher.length; this.pointer=0; public synchronized void produce() throws InterruptedException { while(pointer>=size) this.wait(); //modify monitor state double element = r.nextdouble(); speicher[pointer]= element; System.out.println("Producer produziert: "+element+" und legt es auf Poisiton "+pointer); pointer++; notify(); public synchronized void consume() throws InterruptedException{ while(pointer<=0) wait(); //modify monitor state pointer--; System.out.println("Consumer konsumiert element: "+speicher[pointer]+" an Position "+pointer); notify(); 25.01.2016 Nebenläufigkeit mit Java 03: Synchronisation - Lorenz Schauer 9

class Semaphore { private int value; Konkretes Beispiel: Semaphore public Semaphore (int initial) { value = initial; public synchronized void down() throws InterruptedException { while (value==0) wait(); value--; public synchronized void up() { value++; notify(); 25.01.2016 Nebenläufigkeit mit Java 03: Synchronisation - Lorenz Schauer 10

Programmieraufgabe Schreiben Sie eine kleine Simulation in Java, die den folgenden Anforderungen gerecht wird: In einem Parkhaus gibt es MAX Stellen an Parkplätzen. Zudem wollen Autos über eine Rampe in und aus dem Parkhaus fahren, welche zur gleichen Zeit immer nur von maximal einem Auto benutzt werden kann. Ein Auto kann also nur in das Parkhaus einfahren, wenn die Rampe frei ist und sich mindestens noch ein freier Platz im Parkhaus befindet. Ein Auto kann aus dem Parkhaus ausfahren, wenn die Rampe frei ist. Simulieren Sie Ihre Implementierung mit mind. 10 Autos, die alle ein- und ausfahren wollen. Sorgen Sie für ausreichende Ausgaben, um Ihre Simulation zu testen 25.01.2016 Nebenläufigkeit mit Java 03: Synchronisation - Lorenz Schauer 11

Monitore sind reentrant Das Java Monitor-Konzept D.h.: Ein Thread der einen synchronisierten Block betritt bekommt den Monitor des Objekts (also hält das Lock). Ruft diese Methode eine andere auf, die am gleichen Objekt synchronisiert ist, kann sie sofort eintreten und muss nicht warten! Ohne diese Möglichkeit würde Rekursion nicht funktionieren! Kann Geschwindigkeitsvorteile bringen, wenn viele synchronisierte Methoden nacheinander aufgerufen werden müssen: StringBuffer sb = new StringBuffer(); synchronized( sb ) { sb.append( Hallo " ); sb.append( und Servus, " ); sb.append( wie geht s denn " ); sb.append( allerwei?" ); In StringBuffer sind viele Methoden synchronisiert, was dazu führt, das bei jedem Aufruf der Monitor reserviert werden muss, was Zeit kostet. Daher: Bündelung der Methoden in einem Synchronized Block 25.01.2016 Nebenläufigkeit mit Java 03: Synchronisation - Lorenz Schauer 12

Warum nicht gleich alles synchronisieren? Unerwünschte Nebeneffekte können also durch Markieren der kritischen Abschnitte mittels synchronized verhindert werden! Warum dann nicht gleich jede Methode synchronisieren? Antwort: Führt zu anderen Problemen: Synchronisierte Methoden müssen von JVM verwaltet werden, um wechselseitigen Ausschluss zu ermöglichen. Threads müssen auf andere warten können Das erfordert eine Datenstruktur, in der wartende Threads eingetragen und ausgewählt werden => Kostet Zeit und Ressourcen! Unnötig und falsch synchronisierte Blöcke machen die Vorteile von Mehrprozessormaschinen zunichte. Lange Methodenrümpfe erhöhen die Wartezeit für die anderen! Deadlock-Gefahr steigt! Quelle: http://openbook.rheinwerkverlag.de/javainsel9/bilder/365_java_09_004.gif 25.01.2016 Nebenläufigkeit mit Java 03: Synchronisation - Lorenz Schauer 13

Implementieren Sie das bekannte Philosophen-Problem in Java (zunächst ohne Deadlock-Vermeidung): 5 Philosophen hocken an einem Tisch Es gibt genau 5 Gabeln Das Philosophen-Problem Jeder Philosoph soll abwechselnd schlafen und essen. Will ein Philosoph essen, so versucht er zunächst seine linke Gabel zu nehmen und dann seine rechte. Wenn das klappt, dann isst er und legt anschließend das Besteck wieder zurück Wenn die Gabel nicht vorhanden ist, dann wartet er auf die Gabel, bis sie wieder greifbar ist. Das Philosophen-Problem führt höchstwahrscheinlich irgendwann zu einem Deadlock. Wie könnte dieser vermieden werden? Implementieren Sie nun eine Deadlockfreie Variante Quelle: https://www.dpunkt.de/java/programmieren_mit_java/multithreading/11.html 25.01.2016 Nebenläufigkeit mit Java 03: Synchronisation - Lorenz Schauer 14