1 3 Interaktion über Objekte. 2 3.1 Sperrsynchronisation dient der Vermeidung unkontrollierter nebenläufiger Zugriffe auf gemeinsame Datenobjekte und.

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
der Universität Oldenburg
Klassen - Verkettete Liste -
10.2 Wechselseitiger Ausschluss in Hardware
Einführung in die Programmierung Zusammenfassung
Kritische Betrachtung
Kapselung , toString , equals , Java API
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
6.3 Ereignisbasierte Systeme Ereignis (event) : eine Ereignis-Quelle (event source, publisher) generiert Benachrichtigung (event notification), an der.
Kapitel 6.1 Nebenläufigkeit und wechselseitiger Ausschluss
Ausnahmen HS Merseburg (FH) WS 06/07.
Threads Richard Göbel.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Listen Richard Göbel.
Java: Grundlagen der Objektorientierung
Kapitel 10 Nebenläufigkeit und wechselseitiger Ausschluss
Ein Beispiel in Java.
Konstruktoren.
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
3.1.7 Korrektheit von Objekten Voraussetzung für die Diskussion der Korrektheit von nichtsequentiell benutzten abstrakten Objekten: Modellbasierte Spezifikation:
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: Benutztes Objekt kennt den Kontext seiner Nutzung nicht. Daher kann es in besonderen Situationen keine Entscheidung.
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
DVG Interfaces. DVG mehrfache Vererbung 4 Mehrfache Vererbung ist die Ableitung einer Klassen von mehreren anderen Klassen. –farbigerPunkt.
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
Abstrakte Klassen, Interface
DVG Klassen und Objekte
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Parallel Programming Condition Queues
Thread Synchronisation in JAVA
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
EPROG Tutorium #6 Philipp Effenberger
EPROG Tutorium #5 Philipp Effenberger
Learning By Doing Parallelverarbeitung Multithreading (Nebenläufigkeit) Alte Idee der Parallelverarbeitung statt rein sequentieller Prozesse Parallelverarbeitung.
Threads in Java Wiederholung der BS Grundlagen Alois Schütte AOSD1.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Java Syntaxdiagramme Buchstabe A B Z a z ... Ziffer
7.2.4 Klassifikation mobilen Codes Nicht vergessen:  Sowohl das Fernkopieren als auch die Migration von Objekten setzt voraus, daß der Code entweder am.
2 Nebenläufige Prozesse. 2.1 Programmstruktur und Prozesse private Prozess = Anweisungen + Daten gemeinsame Aber:Wie verhält sich das Konstrukt „Prozess“
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
2 Datenabstraktion Geheimnisprinzip:
Dynamische Prioritäten Statische Prozess-Prioritäten sind sinnvoll, falls Prozesse in wenige Klassen einteilbar (3.3.3) Dynamische Prioritäten.
Nsp Bedingungssynchronisation Motivation: Wenn für eine Operation auf einem Objekt die Voraussetzung nicht erfüllt ist, ist es häufig angebracht,
3 Interaktion über Objekte. 3.1 Sperrsynchronisation dient der Vermeidung unkontrollierter nebenläufiger Zugriffe auf gemeinsame Datenobjekte und der.
5.1.2 Sequentielle Konsistenz
Java-Kurs Übung Besprechung der Hausaufgabe
Threads in Java Threads  Sprachumfang von Java Der Java-Standard fordert nur die Unterstützung von Thread-Prioritäten. Es gibt keine Forderung bzgl.:
IT2 – WS 2005/20061Nov 14, 2005 Visibility  public: Sichtbar in allen Paketen  protected: Sichtbar innerhalb des Pakets und in den Unterklassen  (default,
3.2 Bedingungssynchronisation Motivation: Wenn für eine Operation auf einem Objekt die Voraussetzung nicht erfüllt ist, ist es häufig angebracht, auf deren.
Programmierkurs JavaUE 4 Anweisungen und ProgrammeDietrich BolesSeite 1 Programmierkurs Java Dr. Dietrich Boles Teil Imperative Programmierung Unterrichtseinheit.
93 Das Monitorkonzept (nach Hoare/Brinch-Hansen 1974) Nur ein Prozess bzw. Thread kann zu einem bestimmten Zeitpunkt im Monitor aktiv sein => gegenseitiger.
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
, Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, WS 2005/06 1 Beispiel class SpreadSheet { int cellA1, cellA2, cellA3; synchronized.
Implementieren von Klassen
 Präsentation transkript:

1 3 Interaktion über Objekte

2 3.1 Sperrsynchronisation dient der Vermeidung unkontrollierter nebenläufiger Zugriffe auf gemeinsame Datenobjekte und der damit potentiell verbundenen Schmutzeffekte (1.2  )1.2 Zur Erinnerung: wenn nur gelesen wird, droht keine Gefahr (Beispiel: Zeichenketten in Java sind immutable objects) Gefahr droht, wenn mindestens einer der beteiligten Prozesse, das Datenobjekt modifiziert.

3 Nachteile von  (1.2.2  ):1.2.2  i.a. nicht effizient implementierbar,  meist unnötig restriktiv. Beispiel: co...  a++; ... ||...  a--; ... ||...  b++; ... ||...  b--; ... oc verhindert überlappende Manipulation von a und b – ohne Not!

Kritische Abschnitte Java Statement = | SynchronizedStatement SynchronizedStatement = synchronized ( Expression ) Block Der angegebene Ausdruck muß ein Objekt bezeichnen. Der angegebene Block heißt auch kritischer Abschnitt (critical section).

5 Semantik:Zwischen kritischen Abschnitten, die sich auf das gleiche Objekt (nicht null ) beziehen, ist wechselseitiger Ausschluss (mutual exclusion) garantiert. Die zu diesem Zweck praktizierte Synchronisation wird Sperrsynchronisation (locking) oder Ausschlusssynchronisation (exclusion synchronization) genannt.

6 Beispiel 1: sechs Prozesse mit P1:... synchronized (x) { a++; }... P2:... synchronized (x) { a--; }... P3:... synchronized (y) { b++; }... P4:... synchronized (y) { b--; }... P5:... synchronized (z) { big =... }... P6:... synchronized (z) {... = big; }... mit einer gemeinsamen Variablen double big

7 Beispiel 2: Ausgabe zusammenhängender Listen Spezifikation: interface Printing {// on display (System.out) boolean request(); // reserves display, if possible boolean printLine(String line); // prints line, if display reserved for me boolean release(); // releases display, if reserved for me } Benutzung: if(p.request) do... p.printLine(l);..... p.release;....

8 Implementierung: class Printer implements Printing {..... private final String name; private volatile Thread owner = null; public boolean request() { synchronized(name) { if (owner==null) { owner = Thread.currentThread(); return true; } else return false; } }

9 Implementierung: class Printer implements Printing {..... private final String name; private volatile Thread owner = null; public boolean request() { synchronized(name) { // or (this) ! if (owner==null) { owner = Thread.currentThread(); return true; } else return false; } }

10 public boolean printLine(String line) { if (owner==Thread.currentThread()) { System.out.println(line); return true; } else return false; } public boolean release() { if (owner==Thread.currentThread()) { owner = null; return true; } else return false; } } // end of class Printer

11 Beachte:  Wird ein kritischer Abschnitt vorzeitig beendet (durch Sprung verlassen oder durch Ausnahme abgebrochen), so wird der Ausschluss ordnungsgemäß aufgegeben. (Siehe oben return in request.)  Statische und dynamische Schachtelung von kritischen Abschnitten ist möglich. Befindet sich ein Thread in einem auf das Objekt x bezogenen kritischen Abschnitt, so wird er am Eintritt in einen weiteren auf x bezogenen kritischen Abschnitt nicht gehindert.

12 Beachte mit Bezug auf das Speichermodell von Java:  Beim Eintritt in einen kritischen Abschnitt und beim Verlassen eines kritischen Abschnitts wird der Speicher in einen konsistenten Zustand gebracht.  Mit anderen Worten: wenn gemeinsame Variable ausschließlich innerhalb kritischer Abschnitte manipuliert werden, tauchen die in erwähnten2.2.3 Sichtbarkeits- und Reihenfolgeprobleme nicht auf; volatile im obigen Beispiel 2 ist entbehrlich.

13 Beachte: Verklemmungsgefahr bei dynamisch geschachteltem Sperren: synchronized(x){synchronized(y){ synchronized(y){ synchronized(x){ } }  Nichtdeterministische Verklemmung genau dann, wenn x und y auf verschiedene Objekte verweisen.

14 Alternative Terminologie: „Jedes Objekt hat ein Schloss (lock), das anfangs offen ist. Ist es offen, ist der Eintritt in den kritischen Abschnitt möglich. Beim Eintritt wird das Schloss geschlossen (gesperrt, locked), beim Austritt wieder geöffnet (unlocked).“ Achtung! „Das Objekt wird gesperrt“ ist falsche, irreführende Terminologie! Es gibt keinen notwendigen Zusammenhang zwischen dem Objekt und den im kritischen Abschnitt manipulierten Daten.

15 Präzisierung der Semantik von wechselseitigem Ausschluß:  Keine Überlappung der Ausführung von kritischen Abschnitten, die auf die gleichen Objekte bezogen sind.  Keine Verklemmung beim Versuch von Prozessen, „gleichzeitig“ in einen kritischen Abschnitt einzutreten.  Keine unnötige Verzögerung beim Eintritt in einen kritischen Abschnitt.  Kein unbegrenzt häufiges Vordrängeln von Prozessen, die auf den Eintritt in einen kritischen Abschnitt warten: „faire Behandlung“ der wartenden Prozesse – wird von Java allerdings nicht garantiert!

Monitore (Dijkstra, Brinch Hansen, Hoare, ) Def.:Ein Monitor ist ein Objekt mit  vollständiger Datenabstraktion  vollständigem wechselseitigem Ausschluss zwischen allen seinen Operationen Ideale Syntax (nicht Java!) : Ersetzung von class durch MONITOR oder SYNCHRONIZED CLASS Vorteil: Sicherheit – Invariante bleibt garantiert erhalten! Nachteil: evtl. unnötig restriktiv

17 Java praktiziert einen Kompromiss: synchronized ist als Modifier einer Methode in einer Klasse verwendbar: synchronized otherModifiers MethodDeclaration Semantik bei Objektmethoden: als wäre der Rumpf ein kritischer Abschnitt mit synchronized(this) Semantik bei Klassenmethoden ( static ): als wäre der Rumpf ein kritischer Abschnitt mit synchronized( className.class)

18 Beispiel 1: tabellierte Abbildung Spezifikation: interface Map { // table of (Key,Data) pairs void enter(Key k, Data d); Data lookup(Key k); void remove(Key k); int count(); } (realistisch: Ausnahmen berücksichtigen!)

19 Implementierung: class HashMap implements Map {..... public synchronized void enter(K k, D d) {..... } public synchronized D lookup(K k) {..... } public synchronized void remove(K k) {..... } public synchronized int count() {..... }

20 Beispiel 2: Puffer (buffer) = Warteschlange (queue) von Nachrichten (messages) eines Senders (sender, producer) an einen Empfänger (receiver, consumer) oder auchmehrere Sender/Empfänger send recv Datenfluss SenderEmpfänger Puffer

21 Spezifikation: interface Buffer { // like finite-capacity // sequential Queue (ALP III!) void send(Message m) throws Overflow; // like enqueue Message recv() throws Underflow; // like dequeue }

22 class LinearBuffer implements Buffer { public LinearBuffer(int size) { this.size = size; cell = new M[size];} private int size,count,front,rear; private M[] cell; // element container // invariant: // (front+count)%size == rear & // 0 <= count <= size &..... Repräsentation als linearer „Ringpuffer“ in Feld: size-1 rear front cell

23 Implementierung: public void send(M m) throws Overflow { if(count==size) throw new Overflow(); cell[rear] = m; count++; rear = (rear+1)%size; } public M recv() throws Underflow{ if(count==0) throw new Underflow(); M m = cell[front]; count--; front = (front+1)%size; return m; }

24 Implementierung: synchronized public void send(M m) throws Overflow { if(count==size) throw new Overflow(); cell[rear] = m; count++; rear = (rear+1)%size; } synchronized public M recv() throws Underflow{ if(count==0) throw new Underflow(); M m = cell[front]; count--; front = (front+1)%size; return m; }

25 ? Repräsentation, die mit weniger Ausschluß auskommt ? class LinearBuffer implements Buffer { public LinearBuffer(int size) { this.size = size; cell = new M[size+1];} private int size,front,rear; // no count ! private M[] cell; // element container // invariant: // 0 <= front <= size &..... rear front cell size

26 Implementierung: int count() { return (rear-front+size+1)%(size+1); } public void send(M m) throws Overflow { synchronized(this) { // sender exclusion if(count()==size) throw new Overflow(); cell[rear] = m; rear = (rear+1)%(size+1);} } public M recv() throws Underflow{ synchronized(cell) { // receiver exclusion if(count()==0) throw new Underflow(); M m = cell[front]; front = (front+1)%(size+1); return m; } }

27 Bemerkungen: 1. send und recv operieren stets auf verschiedenen Zellen des Feldes cell – dort kann es also keinen Konflikt zwischen send und recv geben, der zu Nichtdeter- minismus führen würde. 2. send -Inkarnation werden gegeneinander ausgeschlossen, ebenso recv -Inkarnationen (wobei die Wahl der Objekte this und cell hier relativ willkürlich ist). 3. Die Tatsache, dass count nicht unteilbar ist, ist unpro- blematisch. Auch kann count jederzeit von anderen Stellen des Programms her aufgerufen werden.

28 Achtung: Die Lösung ist dennoch nicht korrekt, weil beispielsweise bei leerem Puffer ein recv die Effekte der beiden Zuweisungen eines send in verkehrter Reihen- folge beobachten kann und damit aus einer Zelle liest, bevor sie beschrieben wird. Dieses Problem ist Java-spezifisch und tritt bei anderen Sprachen nicht auf. Die Verwendung von volatile würde hier nicht helfen, da es nicht auf die Feldelemente bezogen werden kann.

29... und drei Übungsfragen:  Warum kann die Prüfung auf Über/Unterlauf nicht aus den kritischen Abschnitten herausgezogen werden?  Kann return m aus dem kritischen Abschnitt herausgezogen werden?  Wie muß eine zusätzliche Operation urgent aussehen, die eine dringliche Nachricht vorn im Puffer ablegt?

Nachrüsten von Ausschluss  bei Klassen, die für sequentielle Benutzung gebaut wurden,  für Objekte, die nichtsequentiell benutzt werden,  durch Bereitstellung eines Monitors,  der als synchronisierte („thread-safe“) Version der Klasse eingesetzt werden kann,  typischerweise mit gleicher Schnittstelle.

31 2 Alternativen:  Vererbung: Monitor ist Unterklasse der Originalklasse  Delegation:Monitor ist Adapter für die Originalklasse voll synchronisiert, da die Implementierung des Originals i.a. unbekannt ist ! Beispiel: interface SortedSet {... boolean add (Object x); boolean contains(Object x); } class TreeSet implements SortedSet {... public boolean add (Object x) {.....} public boolean contains(Object x) {.....} }

32  class SyncTreeSet extends TreeSet {... public synchronized boolean add(Object x){ return super.add(x); } public synchronized boolean contains(Object x){ return super.contains(x); } }  class SyncTreeSet implements SortedSet {... private final SortedSet s = new TreeSet(); public synchronized boolean add(Object x){ return s.add(x); } public synchronized boolean contains(Object x){ return s.contains(x); } }

33 Synchronisierte Adapter kann man über die Fabrik java.util.Collections erhalten, z.B. mittels public static SortedSet synchronizedSortedSet (SortedSet x) { return new SortedSet(){ final SortedSet s = x; } } anonyme Klasse analog zu SyncTreeSet oder public static List synchronizedList(List x) { return new List(){......} } usw.

34 Beachte:Java-Bibliotheksklassen  sind teilweise synchronisiert (z.B. Vector ),  zum großen Teil aber nicht ! Insbesondere ist clone nicht synchronisiert !