Synchronisation in Java. Invisible Web

Ähnliche Dokumente
Verteilte Systeme CS5001

5. Threads, Serverprozesse und Benachrichtigungen

Kapitel 4. Monitore und wechselseitiger Ausschluss

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

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

Monitore. Klicken bearbeiten

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

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

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Java: Vererbung. Teil 3: super()

Musterlösungen zur Klausur Informatik 3

SEP 114. Design by Contract

Programmieren in Java

Ausnahmebehandlung in Java

Programmierkurs Java

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

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

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Java Concurrency Utilities

2.2 Prozesse in Java

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

Softwarelösungen: Versuch 4

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Große Übung Praktische Informatik 1

Software Engineering Klassendiagramme Assoziationen

Algorithmen und Datenstrukturen

Einführung in die Programmierung

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Parallele Prozesse. Prozeß wartet

Einführung in die Programmierung Blockkurs Java

Pakete dienen dazu, die Software eines Projektes in größere inhaltlich zusammengehörige Bereiche mit eigenem Namen einzuteilen (siehe Java API).

Objektorientierte Programmierung

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Vorkurs C++ Programmierung

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Mobile und Verteilte Datenbanken

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Prinzipien Objektorientierter Programmierung

Schieberegler und analoge Anzeigen

Programmiermethodik. Übung 13

Überblick. Lineares Suchen

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Praktikum aus Softwareentwicklung 2, Stunde 5

2A Basistechniken: Weitere Aufgaben

Anleitung: Einrichtung Kontowecker im Sparkassen-App

Programmieren I. Kapitel 15. Ein und Ausgabe

C# im Vergleich zu Java

Innere Klassen in Java

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Assoziation und Aggregation

Zählen von Objekten einer bestimmten Klasse

iphone-kontakte zu Exchange übertragen

IMAP Backup. Das Programm zum Sichern, Synchronisieren, Rücksichern und ansehen von gesicherten Mails. Hersteller: malu-soft

Professionelle Seminare im Bereich MS-Office

Typumwandlungen bei Referenztypen

Lehrer: Einschreibemethoden

Leichte-Sprache-Bilder

Betriebssysteme. Wintersemester Kapitel 2 Prozess und Threads. Patrick Kendzo ppkendzo@gmail.com

1 Was ist das Mediencenter?

teamsync Kurzanleitung

Java Einführung Collections

Klausur zur Einführung in die objektorientierte Programmierung mit Java

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Java Virtual Machine (JVM) Bytecode

Internet Explorer Version 6

Einführung in die Java- Programmierung

Software Engineering Interaktionsdiagramme

Statuten in leichter Sprache

Schritt 1 - Ein Spielfeld

Mobile und Verteilte Datenbanken

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Lebenszyklus von Threads

Übung 8: Semaphore in Java (eigene Implementierung)

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf

Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt

U08 Entwurfsmuster (II)

Komponententest. Testen von Software Systemen. Übung 02 SS 2009 Version:

Client-Server-Beziehungen

Objektorientierte Programmierung. Kapitel 12: Interfaces

Java Kurs für Anfänger Einheit 5 Methoden

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

5. Abstrakte Klassen

IT in der Arztpraxis Technisches Handbuch zum Kodierassistenten

Delegatesund Ereignisse

Einrichten eines Microsoft Exchange-Account auf einem Android-System

Anleitung zur Installation und Nutzung des Sony PRS-T1 ebook Readers

Anleitung zur Installation und Nutzung des Sony PRS-T1 ebook Readers

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Nebenläufige Programmierung I

Aktuell 2014 als Startseite der PK-Website auf Firefox einstellen

Übungen Programmieren 1 Felix Rohrer. Übungen

Oracle: Abstrakte Datentypen:

Java-Schulung Grundlagen

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

Technische Dokumentation SilentStatistikTool

Transkript:

Synchronisation in Java Studienprojekt Invisible Web Tang Zhihong

Synchronisation in Java Synchronisationsproblem Monitore Wait und notify PipedInputStream und PipedOutputStream Synchronisation von Collections

Synchronisationsproblem Nebenläufigkeit: zwei oder mehr Vorgänge gleichzeitig ausführen Sobald auf einem Rechner mehr als ein Prozess laüft, kann es zu Problemen Kommen. Z.B. wenn Zwei Prozesse gleichzeitig auf die selben Daten zugreifen, können Inkonsistenzen entstehen.

Synchronisationsproblem Beide Lesen : Unproblematisch Aber wenn einer liest und einer schreibt: Vorher oder nachher lesen? Oder beide Schreiben: Wer darf nachher schreiben Beispiel :Account Ein Kontostand wird von den Thread erhört undverringert.

Synchronisationsproblem class Account { String name; float amount; public Account(String name, float amount) { this.name = name; this.amount = amount; } public void deposit(float amt) { float tmp = amount; tmp += amt; try { Thread.sleep(1); } catch (InterruptedException e) { // ignore } amount = tmp; } public void withdraw(float amt) { float tmp = amount; tmp -= amt; try { Thread.sleep(1); } catch (InterruptedException e) { // ignore } amount = tmp; } public float getbalance() { return amount; } }

Synchronisationsproblem public class AccountTest { private static int NUM_OF_THREAD = 1000; static Thread[] threads = new Thread[NUM_OF_THREAD]; public static void main(string[] args) { final Account acc = new Account("John", 1000.0f); for (int i = 0; i< NUM_OF_THREAD; i++) { threads[i] = new Thread(new Runnable() { public void run() { acc.deposit(100.0f); acc.withdraw(100.0f); } } ); threads[i].start(); } for (int i=0; i<num_of_thread; i++) { try { threads[i].join(); } catch (InterruptedException e) { // ignore }} System.out.println("Finally, John's balance is:" + acc.getbalance());}}

Synchronisationsproblem Ergebnisse: Finally, John's balance is:6000.0 Finally, John's balance is:6400.0 Finally, John's balance is:6600.0 Finally, John's balance is:6500.0 Finally, John's balance is:7100.0 Ursache: unsynchronisiert gemeinsame Klassenvariable amount deposit und withdraw nicht atomar

Monitore Monitor-Konzept Monitor: Kapselung eines kritischen Bereichs mit Hilfe einer automatisch verwalteten Sperre kritischen Bereichs : eines Programmteils, der nur von jeweils einem Prozess zur Zeit durchlaufen werden darf

Monitore Schlüsselwort: synchronized synchronized auf eine Methode public synchronized void deposit(float amt) {Anweisungen} public synchronized void withdraw(float amt) {Anweisungen}

Monitore synchronized auf einen Block von Anweisungen einzelne Anweisungen können mit lock-objekt synchronisiert werden: Object lock= new Object(); in deposit: public void deposit(float amt) {synchronized(lock) {Anweisungen}} in withdraw: public void withdraw(float amt) {synchronized(lock) {Anweisungen}}

Monitore Es gibt ein Objekt lock, das sich die Methoden im kritischen Bereich(synchronized) teilen müssen, daher Synchronisation. alle Threads, die zur gleichen Zeit versuchen, einen kritischen Bereich eines locks zu betreten, werden solange blockiert, bis der Thread, der in seinem kritischen Bereich gerade abläuft, fertig ist.

wait und notify Potentielle Gefahr von Systemverklemmungen, sog.deadlocks weitere Synchronisationsprimitive: Methoden Wait() und notify()

wait und notify Beispiel: wenn amount >=0, Abbuchen (withdraw) von Konto. wenn amount<0, muss der Thread wihtdraw warten, bis Kontostand wieder positive ist. ABER: alle anderen synchronisierten Threads sind gesperrt das Programm ist in Deadlock

wait und notify Account mit DeadLock class Account{... synchronized void deposit(float amt) {...} synchronized void withdraw(float amt) { try{ while(amount<amt); // Warteschleife } catch(interruptedexception e){ return} amount -=amt;}... }

wait und notify Account ohne DeadLock class Account{... synchronized void deposit(float amt) {... notify(); } synchronized void withdraw(float amt) { try{ while(amount<amt) wait(); } catch(interruptedexception e){ return} amount -=amt;}... }

wait und notify Beispiel public class BSync { int totalthreads; int currentthreads; public BSync(int x) { totalthreads = x; currentthreads = 0;} public synchronized void waitforall() { currentthreads++; if(currentthreads < totalthreads) { try { wait(); } catch (Exception e) {..} } else { currentthreads = 0; notifyall(); } }}

wait und notify Wait()immer in Schleife aufrufen, in der man die Bedingung prüft, auf die der Thread warted Wenn Thread A aus wait() erwacht, betritt er den Monitor an der Wartestelle wieder. Falls Thread B, der notify() auslöste, noch im Monitor ist, muss A warten, bis B den Monitor verlassen hat, da nur ein Thread im Monitor möglich ist! wait() und notify() dürfen nur aus synchronisierten Methoden aufgerufen werden

wait und notify

PipedInputStream und PipedOutputStream mit Hilfe einer Pipe zu synchronisieren beiden Threads über einen ByteStream miteinander verbunden, der von einem Thread geschrieben und von dem anderen gelesen wird. Piping-Konzept : durch die Klassen PipedInputStream und PipedOutputStream realisiert

PipedInputStream und PipedOutputStream die gesamte Synchronisationsarbeit wird automatisch beim Aufruf der read- und write- Methoden erledigt Direkte Kommunikation mit PipeStream:

Synchronisation von Collections Die neuen Collections des JDK 1.2 nicht thread-sicher auf den Gebrauch des Schlüsselworts synchronized weitgehend verzichtet haben Methode: eine unsynchronisierte Collection in eine synchronisierte verwandeln

Synchronisation von Collections Static CollectionsynchronizedCollection(Collection c) static List synchronizedlist(list list) static Map synchronizedmap(map m) static Set synchronizedset(set s) static SortedMap synchronizedsortedmap(sortedmap m) static SortedSet synchronizedsortedset(sortedset s)