Beispiel Klausuraufgaben

Ähnliche Dokumente
Ausnahmebehandlung in Java

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

EINFÜHRUNG IN DIE PROGRAMMIERUNG

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

Lebenszyklus von Threads

Beispiel für überladene Methode

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

Dr. Monika Meiler. Inhalt

Synchronisation in Java. Invisible Web

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

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

Parallele Prozesse. Prozeß wartet

Prozesszustände (1a)

Softwaretechnik 1 Übung 5

Erste Java-Programme (Scopes und Rekursion)

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

Informatik II. Semesterklausur

Nebenläufigkeit mit Java

Übung zu Grundlagen der Betriebssysteme. 10. Übung

Nebenläufige Programmierung I

Institut für Programmierung und Reaktive Systeme 25. Januar Programmieren I. Übungsklausur

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

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

Implementieren von Klassen

Prof. Dr. Uwe Schmidt. 21.August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (BInf 211, BTInf 211, BMInf 211, BWInf 211)

Einstieg in die Informatik mit Java

Einführung in die Informatik 1

Java Concurrency Utilities

Javakurs für Anfänger

Institut für Programmierung und Reaktive Systeme 2. Februar Programmieren I. Übungsklausur

Klausur Software-Entwicklung März 01

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

Einstieg in die Informatik mit Java

Verteilte Systeme CS5001

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

Einführung Verteilte Systeme - Java Threads I -

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

Delegates. «Delegierter» Methoden Schablone Funktionszeiger. Dr. Beatrice Amrhein

Matrikelnummer: 1 Aufgabe 1: Quickies (30 Punkte) a) Wird das folgende Programm von einem Java-Übersetzer ohne Beanstandungen übersetzt? Falls nicht,

Ausdrücke in Scala. Funktionale Programmierung. Christoph Knabe FB VI

Programmiermethodik 1. Klausur

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

2. Unterprogramme und Methoden

Scala. Funktionale (Zustandslose) Objekte

Aufgabe 9 Threads [12]

C# - Einführung in die Programmiersprache Methoden. Leibniz Universität IT Services

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

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015

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

- EINSTIEG IN JAVA - (1/5) Datum:

Java für Anfänger Teil 4: Anweisungen. Programmierkurs Manfred Jackel

Einführung in die Programmierung WS 2009/10. Übungsblatt 5: Typen, Variablen und einfache Methoden in Java

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

Java Übung. Übung 3. Werner Gaulke. 2. Mai Universität Duisburg-Essen Kommedia, Übung EinPro SS06, Einführung in Java - Übung.

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

Programmierung mit Threads in Java

Arbeitsblätter für die Lehrveranstaltung OOP JAVA 1

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

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

Funktionale und Objekt-Orientierte Programmierkonzepte

Arbeitsblatt zu Methoden

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

Programmierung für Mathematik HS11

Objektorientierte Programmierung Studiengang Medieninformatik

Vorkurs Informatik WiSe 15/16

Geoinformatik und Vermessung Prüfung 502 : Informatik (JAVA)

Java - Programmierung - Prozedurale Programmierung 1

Objektorientierung. Klassen und Objekte. Dr. Beatrice Amrhein

Transkript:

Beispiel Klausuraufgaben HINWEIS: In diesem Dokument befinden sich mehrere Aufgaben. Es ist keine Beispielklausur. In der Klausur werden nur ca. 2 Aufgaben zu meinen Themengebieten (Nebenläufigkeit, Visuelle Programmierung, Entwurfsmuster) gestellt.

Aufgabe 1: Welche der folgenden Methoden sind threadsafe? public class DemoParallel { final private int scalefactor = 2; private int sum=0; private int counter = 0; public int square (int x) { return x * x; public int addnumber (int n) { sum += n; return sum; public void addsquarenumber (int n) { sum += n*n; counter++; public double getscalefactor () { return scalefactor / 100.0 ; Begründen Sie Ihre Antworten. Ergänzen Sie den Programmcode so, dass die Klasse threadsafe wird und möglichst wenig blockiert.

Lösung Aufgabe 1 (ergänzter Code in rot) square ist threadsafe, da nur lokale Variable auf dem Stack verändert werden. addnumber ist nicht threadsafe, da mehrere Threads gleichzeitig auf sum zugreifen können und Wettlaufbedingungen auftreten. Z.B. kann zwischen dem Addieren von n und dem Rückgabewerte von n ein zweiter Thread den Wert von sum schon wieder verändert haben. Alternative Begründung: Die Anweisung sum+=n wird nicht atomar auf dem Prozessor ausgeführt. So kann es passieren, dass ein Thread den gerade geänderten Wert eines anderen Thread überschreibt. Die Folge sind inkonsistente Werte. Mit dem synchronized Schlüssewort können Sie die Methode threadsicher gestalten: public synchronized int addnumber (int n) { sum += n; return sum; addsquarenumber ist nicht threadsicher, da mehrere Threads gleichzeitig auf sum oder counter zugreifen können und es Wettlaufbedingungen kommen kann. Threadsicherheit lässt sich durch Objektsperren herstellen. Damit das Programm möglichst wenig blockiert wird für die unabhängigen Daten sum und counter jeweils eine andere Sperre verwendet. In Java kann jedes Objekt als Sperre verwendet werden, wir erzeugen also einfach zwei Objekte. Object sumguard = new Object (); Object counterguard = new Object (); public void addsquarenumber (int n) { synchronized (sumguard) { sum += n*n; synchronized (counterguard) { counter++; getscalefactor ist threadsicher, da nur auf unveränderliche Werte zugegriffen wird.

Aufgabe 2: Nebenläufigkeit mit Actors Im Folgenden sehen Sie einen in Java geschriebenen Programmcode, der den Inhalt von Dateien lädt, den Inhalt verschlüsselt und dann wieder als Datei speichert. Das Speichern soll nebenläufig in einem eigenen Thread geschehen. Die main-methode übergibt die verschlüsselten Daten mit einem neuen Dateinamen an eine Warteschlange (BlockingQueue). Der FileSaver läuft in einem eigenen Thread und bedient sich fortlaufend aus dieser Warteschlange.

// Hilfsklasse als Datencontainer public class EncryptedData { public String filename; public String data; public class Setup { public static void main(string[] args) { // Warteschlange für die Daten, die gespeichert werden sollen BlockingQueue <EncryptedData> savequeue = new LinkedBlockingQueue<EncryptedData>(); // Dieser Thread erledigt das Speichern: Thread saving = new Thread ( new FileSaver (savequeue)); saving.start(); // Alle als Argument übergebenen Dateien sollen verschlüsselt werden: for (int i=0; i<args.length; i++) { try { // Datei laden, Inhalt verschlüsseln und als // EncryptedData-Objekt in die // Warteschlange zum Speichern legen String filename = args [i]; String content = UtilsClass.loadFile (filename); EncryptedData ec = new EncryptedData(); ec.filename = filename + ".encrypted"; ec.data = UtilsClass.encrypt(content); savequeue.put(ec); System.out.println("Unable to encrypt all files."); public class FileSaver implements Runnable { BlockingQueue<EncryptedData> savequeue; public FileSaver (BlockingQueue<EncryptedData> savequeue ) { this.savequeue = savequeue; public void run() { while (true) { try { // Nimm das nächste Element aus der Warteschlange // und speichere es ab. EncryptedData ec = savequeue.take(); UtilsClass.saveFile(ec.fileName, ec.data); catch (InterruptedException e) { e.printstacktrace();

Schreiben Sie ein Programm mit gleicher Funktionalität in Scala unter Verwendung von Actors. Nutzen Sie eine Case Klasse für die Nachrichtenübermittlung. Hinweis: um die Laden, Speichern, und Verschlüsseln Funktionen müssen Sie sich nicht kümmern, diese sind über einfach über ein UtilsObject vorhanden. import scala.actors.actor._ object Setup { case class EncryptedData ( filename : String, data : String) def main(args: Array[String]): Unit = { // TODO: Definieren und starten sie den Actor zum Speichern hier: // Hier werden bereits alle Dateien geladen und verschlüsselt // Sie müssen aber noch die Nachricht zum Speichern an den // Actor senden for (filename <- args) { val content = UtilsObject.loadFile(fileName) val encrypted = UtilsObject.encrypt(content) // TODO: Senden Sie die Nachricht zum Speichern hier:

Lösung Aufgabe 2 (ergänzter Code in rot) import scala.actors.actor._ object Setup { case class EncryptedData ( filename : String, data : String) def main(args: Array[String]): Unit = { // TODO: Definieren und starten sie den Actor zum Speichern hier: val saveactor = actor { while(true) { receive { case ec : EncryptedData => UtilsObject.saveFile(ec.fileName, ec.data ) // Hier werden bereits alle Dateien geladen und verschlüsselt // Sie müssen aber noch die Nachricht zum Speichern an den // Actor senden for (filename <- args) { val content = UtilsObject.loadFile(fileName) val encrypted = UtilsObject.encrypt(content) // TODO: Senden Sie die Nachricht zum Speichern hier: saveactor! EncryptedData(content,encrypted)

Aufgabe 3: Deadlocks Was ist ein Deadlock? Beispiellösung: Eine Verklemmung (deadlock) ist eine durch eine zyklische Abhängigkeit bewirkte Verhinderung der Programmausführung. Die Abhängigkeit zwischen verschiedenen Threads entstehen, wenn diese um gemeinsame Ressourcen (z.b. Objektsperren) konkurrieren. Nennen Sie ein Alltagsbeispiel Beispiellösung: In eine enge Straße fahren zwei Autos von gegenüberliegenden Seiten hinein. Die Autos kommen nicht aneinander vorbei. Jeder Fahrer beharrt auf sein Recht als erster zu fahren und weigert sich zurückzusetzen das kostet ja Zeit. Also stehen beide Autos dort für ewig Nennen Sie eine Maßnahme, mit der sich Deadlocks vermeiden lassen. Beispiellösungen (eine Antwort würde reichen): - Vermeiden von Methodenaufrufen innerhalb eines gesperrten Bereichs, weil diese Methoden eventuell weitere Sperren nutzen. Deadlocks entstehen immer nur wenn mind. zwei Sperren involviert sind. - Möglichst kurze Codeabschnitte sperren, innerhalb eines kritischen Abschnitts keine blockierenden Methoden aufrufen, z.b. put oder take einer BlockingQueue nicht aus einem kritischen Abschnitt heraus aufrufen - Für voneinander unabhängige Daten sollten verschiedene Sperren genutzt werden Warum können Maßnahmen zur Threadsicherheit die Wahrscheinlichkeit eines Deadlocks erhöhen? Beispiellösung: Um Wettlaufbedingungen zu vermeiden, werden häufig Objektsperren eingesetzt, mit denen man kritische Bereiche schützt. Wenn zwei kritische Abschnitte gleichzeitig gesperrt sind, kann es vorkommen, dass zwei Threads gegenseitig aufeinander warten. Warum lässt sich schwer testen, ob ein Programm Deadlock-Situationen enthält? Beispiellösung: Aufgrund des nicht-deterministischen Ablaufs nebenläufiger Programme treten Deadlocks meist nur unter bestimmten (oft zufälligen) Konstellationen auf. Es kann z.b. sein, dass ein Deadlock nur bei jedem 100000. Mal auftritt, während 99999 Testläufe vorher problemlos funktionierten. Es kann ssein

Aufgabe 4: Entwurfsmuster Gegeben sei folgender Code, der je nach Wetterlage verschiedene Aktivitäten startet. public class Freizeit { final int SONNE = 1; final int REGEN = 2; final int SCHNEE = 3; final int STURM = 4; int wetter = SONNE; public void setwetter (int neueswetter) {wetter = neueswetter; public void aktivitaet () { if (wetter == SONNE) { p.eisessen (); p.setlaune ( "super") ; if (wetter == REGEN) { p.mantelanziehen(); p.setlaune ("mies"); if (wetter == SCHNEE) { p.mantelanziehen(); p.setlaune("gut"); Mit welchem Entwurfsmuster lässt sich der Code verbessern? Zeichnen Sie das Klassendiagramm für eine verbesserte Struktur.

Lösung Aufgabe 4 Das Strategie Muster (Strategy Patter) kann hier helfen:

Aufgabe 5: Visuelle Programmierung Skizzieren Sie ein datenflussorientiertes Programm, mit dem Sie folgenden Ausdruck berechnen: ergebnis = power ( 5 * 2 + 34, 3) Sie dürfen eigene Symbole und Zeichen erfinden, aber das datenflussorientierte Paradigma muss erkennbar sein. Lösungsbeispiel Aufgabe 5