JAVA & Objektorientiertes Programmieren

Eine Einführung in das objektorientierte Programmieren mit JAVA Diese Kartei baut auf dem Stoff des Moduls OOP an der HSLU geleitet von Roland Gisler auf.

Eine Einführung in das objektorientierte Programmieren mit JAVA Diese Kartei baut auf dem Stoff des Moduls OOP an der HSLU geleitet von Roland Gisler auf.


Kartei Details

Karten 500
Lernende 19
Sprache Deutsch
Kategorie Informatik
Stufe Universität
Erstellt / Aktualisiert 04.12.2016 / 16.08.2024
Weblink
https://card2brain.ch/box/java_objektorientiertes_programmieren
Einbinden
<iframe src="https://card2brain.ch/box/java_objektorientiertes_programmieren/embed" width="780" height="150" scrolling="no" frameborder="0"></iframe>

Java macht automatische (implizite) Casts von grösseren zu kleineren elementaren Datentypen, weil diese (meist) gefahrlos sind.

Java macht automatische (implizite) Casts von kleineren zu grösseren elementaren Datentypen, weil diese (meist) gefahrlos sind.

Wie lässt sich der Typ eines Objektes abfragen?

Mit einer Expression: (object instanceOf Klasse)

Jede Klasse in Java kennt auch die Methoden, die auf Object deklariert sind

Durch das Subtyping erklärt sich, dass (Referenz-)Variablem vom Typ Object tatsächlich ____________ Objekt irgendeiner beliebigen Java-Klasse zugewiesen werden kann.

Mit welchem Wert ist der Counter initialisiert?

0

Was macht die Methode increment() in der Klasse Counter?

Erhöht den Wert um 1

Überlege wie die Counter-Klasse angewendet werden könnte?

siehe Bild

Was erwarten wir bei diesem Beispiel (siehe Bild) als Resultat?

siehe Bild

In diesem Beispiel geht es um die nebenläufige Nutzung von der Counter-Klasse.
Wie könnte man die Worker-Klasse implementieren? (siehe Bild)

siehe Bild

Was bedeuted "race condition"?

Befinden sich mehrere Threads gleichzeitig in einem Abschnitt, überschreiben sie sich gegenseitig den aktuellen "Counter-Stand", wenn ein Thread-Scheduling stattfindet. Durch die parallele Ausführung entsteht eine Inkonsistenz! Das exakte Verhalten des Schedulers ist nicht deterministisch vorhersagbar, und somit ist das Endresultat ein zufälliges Ergebnis einer sogenannten "race condition" (Wettlauf der Threads)

Wie kann man Inkonsistenzen durch parallele Ausführungen von Threads verhindert werden?

Indem man in den betroffenen kritischen Abschnitten sicherstellt, dass sich zu jedem Zeitpunkt nur genau ein Thread aufhalten darf. Die Threads müssen sich somit gegenseitig aus dem kritischen Abschnitt ausschliessen: Mutual exclusion (Mutex)

In welchem Zusammenhang wird der Begriff "Locking" verwendet?

In Zusammenhang mit Semaphoren. Vereinfacht: Ein Sperre, dessen Zustandsprüfung und die nachfolgende Belegung untrennbar (atomar) verknüft sind.

Vor dem Eintritt in den kritischen Abschnitt wird geprüft, ob die Sperre für diesen Abschnitt frei ist. Wenn ja: Sperre setzen, kritischen Abschnitt abarbeiten, austreten und Sperre wieder frei geben. Wenn nein: Warten bis Sperre frei ist.

Wie funktioniert der Vorgang Synchronisation?

Vor dem Eintritt in den kritischen Abschnitt wird geprüft, ob die Sperre für diesen Abschnitt frei ist. Wenn ja: Sperre setzen, kritischen Abschnitt abarbeiten, austreten und Sperre wieder frei geben. Wenn nein: Warten bis Sperre frei ist.

Java bietet vielfältige Sperrmechanismen an (Semaphore, Lock etc.), aber der Einsatz dieser Primitiven erfordert einige Erfahrung. Darum bietet Java welches abstraktere Konzept an?

Monitore

Was passiert mit einem Codeabschnitt der in einen Monitor eingefasst wird?

Welche Einsatzszenarien gibt es?

Es erfüllt das Kriterium des gegensetigen Ausschlusses (Mutex)

Einsatzszenarien:
- entweder auf eine ganze Methode, oder
- auf einen expliziten Codeblock

Was ist das Schlüsselwort für einen Monitor?

synchronized

Wie könnte man die Methode increment() in einen Monitor einfassen?

siehe Bild

Was ist der Vorteil, wenn man die Methode increment() mit synchronized (wie im Bild) implementiert?

Die ganze Methode wird als kritischer Abschnitt (critical section) definiert, pro Instanz der Klasse kann nur genau ein Thread die Funktion ausführen (die konkurrenzierende Threads müssen warten --> Queue)

Synchronisation verhindert Parallelität und kostet auch Zeit: Darum kritische Abschnitte immer ________________ definieren!
 

Weshalb wird die folgende Implementierung der Methode imcrement über der Implementierung im Bild empfohlen?

Empfohlen:
public void increment()   {
    synchronized (this)    {
        long temp = this.count;
        temp++;
        this.count = temp;
   }
   LOG.debug("Counter wurde inkrementiert");
}

Nur der wirklich kritische Abschnitt wird synchronisiert. Effizientere Lösung, Blöcke in der Regel empfohlen.

this identifiziert hier als Referenz den "Besitzer" des Monitors.
Es wäre somit möglich über verschiedene Objekte voneinander unabhängige Monitore zu definieren (Vorsicht!)

Sind alle Klassen die nicht explizit als "thread-safe" dokumentiert sind, tatsächlich nicht threadsicher?

Ja, das gilt für alle Standard-Datenstrukturen aus java.util und z.B. auch für alle GUI-Klassen von Swing!

-> Begründung: Synchronisation kostet imer auch Zeit und ist somit langsamer.

Werden Datenstrukturen gemeinsam von mehreren Threads verwendet, müssen diese _________ implementiert sein. Ansonsten?

"thread-safe". Ansonsten drohen beliebige Inkonsistenzen und Exceptions!

Wie geht man vor wenn mein eigene Klassen implementieren, welche auch nebenläufig genutzt werden können/sollen?

Man muss diese selber thread-safe implementierieren!

Vorgehen: Analyse des Codes und Identifikation der kritischen Abschnitte. Synchronisation mit geeigneten Mitteln.

Was ist die Herausforderung, wenn man Klassen selber thread-safe implementiert?

Testen ist nur sehr eingeschränkt oder nur mit viel Aufwand möglich (es passiert meistens sehr selten etwas, aber wenn...)

Threadsicherheit: Anspruchsvolle Aufgabe, braucht Erfahrung!

Bei eigenen Implementationen von Klassen: Unbedingt dokumentieren, ob eine Klasse thread-safe implementiert ist oder nicht!

Was passiert bei zu viel Synchronisation?

Langsames Programm, und Gefahr von Deadlocks!

Was bedeutet nebenläufig?

Mehrere Vorgänge heissen nebenläufig, wenn sie voneinander (weitgehend) unabhängig und parallel bearbeitet werden können.

Was ist das Problem bei der Nebenläufigkeit von mehreren Prozessen auf einem Rechner?

Es findet ein Wettstreit um die dafür notwendigen Betriebsmittel statt

Zwei nebenläufige Prozesse sind also nur bezüglich ihrer Abarbeitung unabhängig; sie sind jedoch indirekt voneinander abhängig, wenn sie z.B. auf gleiche Ressourcen zugreifen wollen und(oder auf ein Ereignis warten müssen

Nenne ein typischen Beispiel indem ein Programm mehrere Aktionen gleichzeitig (quasi-parallel) ausführt

Dokument "im Hintergrund" ausdrucken, während man in der Textverarbeitung weiter arbeiten kann.

Ist dies eine Vereinfachung des Programmiermodelles/-semantik?

Statt innerhalb einer Methode n Datenquellen zu verarbeiten, startet man n parallele Verarbeitungen mit je einer Datenquelle

Ja, vergleiche: Verarbeitung von n Kommunikationsverbindungen

Aktuelle Technologien unterstützen hardwaremässig Parallelität, z.B. Multi-Core Prozessoren / Hyper-Threading-Technik. Hier lässt sich die Rechenleistung nur über Parallelisierung in der Ausführung ausschöpfen!

Was ist ein Prozess?

Ein Programm in der Ausführung.

Ein Programm kann somit mehrfach (in n-Prozessen) ausgeführt werden. Jeder Prozess hat dafür seinen eigenen (meist virtuellen) Speicher.

Wo werden alle Prozesse verwaltet und kontrolliert?

Alle Prozesse werden vom Betriebssystem in einer Prozessliste verwaltet und kontrolliert.

Jeder Prozess hat seinen eigenen Prozess-Kontext

Was ist ein Thread?

Ein Thread ist der eigentliche Ausführungsstrang mit jeweils eigenen Registern und Stack im gemeinsamen Speicher des Prozesses

Bei vielen Betriebssystemen ist ein Prozess "nur" ein logisches Konstrukt; jeder Prozess hat mindestens einen (Haupt-)Thread.

Was ist Scheduling und was ein Scheduler?

Der Scheduler des Betriebssystems teilt die Rechenzeit den Prozessen und Threads nach verschiedenen Kriterien möglichst fair und effizient zu.

Abhängig von Zustand, Priorität und Art des Prozesses.

Weshalb wird ein Scheduler benötigt?

Prozesse und Threads werden, zur besseren Ausnutzung aller Ressourcen, (pseudo-)parallel ausgeführt.

In der Regel ist immer eine wesentlich grössere Menge von Threads als Prozessoren (bzw. cores) vorhanden. Threads konkurrenzieren somit alle um den Prozessor

Wie oft werden Threads neu geschedult.

im Schnitt ca. alle 10-20ms

Grössenordnung: Reaktionszeit eines Menschen!
So entsteht der Eindruck der (Pseudo-)Parallelität

Welche Zustände kann ein Thread während seines Lebenszyklus einnehmen?

(siehe Bild)

Die verschiedenen Übergänge zwischen den Zuständen werden implizit oder explizit durch das Programm oder das Betriebssystem (-> Scheduler) ausgelöst.

Beschreibe den Threadzustand new

Thread ist mit new erzeugt, aber noch nicht gestartet

Beschreibe den Threadzustand ready

Thread ist gestartet (start()) und lauffähig und wartet auf die Zuweisung auf einen Prouesser(-kern).