Offizieller OIO-Seminar-Titel !

Werbung
Schneller fahren auf
mehr Spuren?
Multithreading im Zeichen von
Mehrkernprozessoren
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
Version: 1.2
www.oio.de
[email protected]
Steffen Schluff
Papick Garcia Taboada
Schneller fahren auf mehr Spuren?
•
Die neue bekannte Herausforderung
•
Multithreading und Enterprise Architekturen
•
Was tun als Programmierer ???
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
2
Das Multi-Core Dilemma…
Diskussionen gerade sehr aktuell
Doug Lea
…
Brian Goetz
java.util.concurrency Package
…
JSR 166, JDK 1.5
…
Patrick Leonard
Java Concurrency in Practice
…
Krieg der Kerne, iX
…
Blog von Patrick Leonard, Diskussion of TSS
…
Keynote von Tim Bray auf der WJAX 2006
…
Verschiedene Sessions auf namhaften Konferenzen seitdem…
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
Tim Bray
3
Schluss mit Lustig?
•
Seit 30 Jahren konstanter CPU Performance Anstieg
– Taktfrequenz,
Ausführungsoptimierung,
Cache
– Sicherer
Performance
Gewinn
für Software
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
4
2007 und noch immer keine Lösung…
•
CPU Taktfrequenz beginnt zu schwächeln
– Bisheriger Trend endet circa 2004
– Probleme: Wärmeentwicklung, Stromverbrauch, Leckströme
– Neue Ansätze versprechen immer wieder schnellere Prozessoren,
bisher aber keine Produktionsreife erreicht
•
Free lunch is over?
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
5
Moore hat immer noch recht!
•
Wachstum der Transistordichte noch vorhanden (Moore‘s Law)
•
Hardware Hersteller satteln um
– Hyperthreading, Caches
– Multicore-Technik
• braucht wenig Platz
• kein völlig neues Design
• günstigere Energiebilanz
– Bei Erhöhung des Taktes steigt der Energiebedarf zum Quadrat
– Bei Erhöung der Kerne steigt der Verbrauch „nur noch“ linear an
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
6
Wie sind die veränderten Prognosen für die
Zukunft?
•
Cache Wachstum beschleunigt Anwendungen auch weiterhin
•
Aber Multithreading/Multicore beschleunigt Software nicht von
selbst
– Viele Anwendungen sind nicht für Mehrprozessorsysteme Entwickelt
worden, laufen schließlich nur auf einem (meist langsameren Kern)
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
7
Wie läßt sich Hardware Wachstum weiter
optimal nutzen?
•
Umdenken in der Entwicklung erforderlich
•
„Concurrent software“ wird zunehmend wichtig werden
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
8
Neue Herausforderungen für Software
Entwickler
•
Neue Architekturen, APIs und Technologien
•
Umdenken im Bereich Testen und Performance
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
9
Offene Fragen,
neue Problemstellungen
„No matter how great
and destructive
your problems
may seem now,
remember,
you've probably only
seen the tip of them“
Increasing success by
lowering expectations
http://www.despair.com
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
10
Multithreading, ist das was neues?
Wikipedia, Multithreading
Der Begriff Multithreading (auch Mehrfädigkeit) bezeichnet das
zeitgleiche Abarbeiten mehrerer Threads (das sind
Ausführungsstränge innerhalb eines einzelnen Prozesses oder
eines Tasks).
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
11
Java Buzzwordbingo!
The Java programming language is a high-level language that
can be characterized by all of the following buzzwords:
Simple
Architecture neutral
Object oriented
Portable
Distributed
High performance
Multithreaded
Robust
Dynamic
Secure
Quelle: The Java Tutorials, The Java Technology Phenomenon
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
12
Java Buzzwordbingo!
The Java programming language is a high-level language that
can be characterized by all of the following buzzwords:
Simple
Architecture neutral
Object oriented
Portable
Distributed
High performance
Multithreaded
Robust
Dynamic
Secure
Quelle: The Java Tutorials, The Java Technology Phenomenon
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
13
Also…
Java kann doch Multithreading!
•
Java unterstützt seit Beginn Multithreading
–
–
–
–
–
–
–
synchronized,
volatile
wait()
notify()
notifyAll()
Collections.synchronized[Collection|List|Set|Map](…)
U.s.w. …
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
14
Aber…
Können wir es?
•
In der Praxis aber schwer anwendbar
– Multithread Programmierung syntaktisch einfach,
aber keineswegs trivial!
– Komplizierte Konstrukte mit niedrigem Abstraktionsgrad
– In reiner Form ungeeignet für Anwendungsentwicklung
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
15
Wie gut ist die eigene Lösung?
•
Jeder kocht sein eigenes Süppchen
– Viele hausgemachte Ad-Hoc Lösungen
– Eigene Lösungen oft unausgegoren und nur schwer testbar
Î Einarbeitungszeit für neue Mitarbeiter?
Î Testbarkeit?
Î Dokumentation?
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
16
Java, Threads und…
CPUs?
Angenommen,
wir (Entwickler) sind in der Lage Concurrent
Software zu entwickeln,
wie werden meine Threads auf CPUs verteilt?
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
17
Mehrere CPUs in Java nutzen
•
Java stellt keine eigene Funktionen
zur Prozesskontrolle und
Prozesssteuerung bereit
Verschiedene Arten von Threads
(aus Sicht der VM)
– Je nach OS verschiedene
Ansätze
– OS Frage als Platform (wieder)
Aktuell?
Multithreading im Zeichen von Mehrkernprozessoren
Green Threads
Threads „nur
innerhalb“ einer VM
Native Threads (heute
Standard)
Java Threads werden
auf Betriebsystemprozesse
abgebildet Betriebsystem
ist für Scheduling
zuständig
© 2007 Orientation in Objects GmbH
18
CPU Affinity?
Bug ID: 4234402
Synopsis: (thread) Thread.setCPUAffinity?
State: Closed, will not be fixed
(…)
But this is ignoring the basic fact that only the most
sophisticated Java users could expect to gain real advantage
with such a feature (i.e. by making better scheduling choices than
the operating system would make without use of the feature)
(…)
Quelle: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4234402
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
19
Java & Windows
•
Native Threads sind Win32 Threads
– Windows ist für Scheduling
und Synchronization zuständig
– Tools zur Überwachung sind im
Windows Softwareumfeld zu suchen
– „Leistung“ (perfmon.msc) bietet
viele Überwachungsmöglichkeiten
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
20
Visualisierung mit Perfmon.msc
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
21
Schneller fahren auf mehr Spuren?
•
Die neue bekannte Herausforderung
•
Multithreading und Enterprise Architekturen
•
Was tun als Programmierer ???
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
22
Wo helfen viele Prozessoren?
•
Virtualisierung von Rechnern
– Xen, VM Ware, OpenVZ, u.v.a.
•
Erhöhung der Performance
einzelner Server bzw. Dienste die bereits
Multithreaded sind
– Application Server
– Mail Server
– U.s.w.
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
23
Eigentlich nichts Neues
•
„Enterprise“ Hardware schon seit längerer Zeit
Multiprozessorbasiert
– Symmetrisches Multiprocessing ist seit Ende der 80er Jahre die
Standard-Architektur für Multiprozessor-Maschinen mit bis zu 16
CPUs.
•
Java Enterprise Edition adressiert thread safety und concurrency
bereits in der Architektur
•
Warum also erst jetzt die ganze Diskussion?
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
24
Hardware…
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
25
Und (Enterprise) Software…
•
Java wird stark im Umfeld Unternehmenskritischer Anwendungen
eingesetzt
– Java Enterprise Edition
•
Java EE Architekturen vereinfachen
die Softwareentwicklung
-
Laufzeitumgebung
Schnittstellen
Programmiermodell
Vorschriften bzw. Restriktionen
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
26
Java EE Architektur, EJBs
The Enterprise JavaBeans architecture will make it easy to write
applications: application developers will not have to understand low-level
transaction and state management details, multi-threading, connection pooling, or
other complex low-level APIs.
The enterprise bean must not attempt to manage threads. The enterprise bean
must not attempt to start, stop, suspend, or resume a thread, or to change a
thread’s priority or name. The enterprise bean must not attempt to manage thread
groups.
These functions are reserved for the EJB container. Allowing the enterprise bean
to manage threads would decrease the container’s ability to properly manage the
runtime environment.
Quelle: Enterprise JavaBeans 3.0 Final Release
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
27
Java EE Architektur
The Enterprise JavaBeans architecture will make it easy to write
applications: application developers will not have to understand low-level
transaction and state management details, multi-threading, connection pooling, or
other complex low-level APIs.
The enterprise bean must not attempt to manage threads. The enterprise bean
must not attempt to start, stop, suspend, or resume a thread, or to change a
thread’s priority or name. The enterprise bean must not attempt to manage thread
groups.
These functions are reserved for the EJB container. Allowing the enterprise
bean to manage threads would decrease the container’s ability to properly manage
the runtime environment.
Quelle: Enterprise JavaBeans 3.0 Final Release
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
28
Java EE und „thread safety“
•
Prinzipiell sorgt ein Application Server dafür, dass die
Komponenten sich nicht um „thread safety“ kümmern müssen
– Das bezieht sich aber nur auf EJBs
• z.Bsp. werden SLSB werden mehrfach instanziert um exklusivität
(und dadurch Threadsafety) während eines Methodenaufrufs zu
garantieren
– Servlets sind Singletons und werden u.U. von verschiedenen Threads
gleichzeitig aufgerufen, müssen also Threadsafe sein.
• Thread Synchronization ist keine Lösung
• Das Interface SingleThreadModel ist „deprecated“
seit Servlet API 2.4
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
29
Java EE und „thread safety“ Fazit
Nur EJB Anwendungen sind „out of the box“ thread safe
– Gut:
• Entwickler muss sich nicht um Threads und Threadsafety kümmern
• Anwendung skaliert in Bezug auf Anzahl der Anfragen/ Clients ohne
zutun des Entwicklers
– Schlecht:
• Entwickler kann keine Threads starten und somit keine
Lösungsansätze anstreben, die Nebenläufigkeit einbeziehen
• Anwendung skaliert nicht in Bezug auf Komplexität der
Businesslogik wenn sequentielle Algorithmen versagen
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
30
Problembereich Webanwendungen
•
Thread safety in Webanwendungen nicht immer gegeben
– „Wir brauchen keine EJBs. Wir wollen nur eine einfache
Webanwendung bauen“
• Anmerkung: Es gibt nicht sowas wie eine „Einfache
Webanwendung“
– Viele Webanwendungen verzichten auf EJB-Schicht
– Entwickler müssen sich mit „thread safety“ auseinandersetzen
• Was kümmer mich „thread safety“? Bin doch J2EE Entwickler…
• „Know How“ vorhanden?
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
31
Ist Spring die Rettung?
•
Teilweise…
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
32
Solving other peoples‘ problems…
Die mit Spring mitgelieferten „Data Access Templates“
sind thread safe.
- Problembereich Hibernate!
Dadurch wird die Implementierung einer DAO Schicht innerhalb
einer Webanwendung deutlich vereinfacht.
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
33
Vorsicht…
•
Die in Spring konfigurierte business Schicht (services) müssen je
nach Umfeld „thread safe“ entwickelt werden.
•
Dennoch muss sich ein Entwickler mit der Tatsache
auseinandersetzen, dass thread safety in einer Webanwendung
nicht gegeben ist und das entsprechende Know How aufbauen
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
34
Project Danger?
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
35
Schneller fahren auf mehr Spuren?
•
Die neue bekannte Herausforderung
•
Multithreading und Enterprise Architekturen
•
Was tun als Programmierer ???
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
36
Der Silberstreifen am Horizont
•
Pionierarbeit durch Doug Lea
– Web Page und Veröffentlichungen seit Ende der 90er
– Entwicklung eigener Java API (EDU.oswego.cs.dl.util.concurrent)
•
Einrichtung JSR 166
– „... provide functionality commonly needed in concurrent programs.“
– Geleitet durch Doug Lea
•
Ergebnis „Concurrency Utilities“
– Seit Java 5 fest im JDK (java.util.concurrent)
– Etwas untergegangen im Sprachfeature Trubel
– Diverse Erweiterungen in Java 6
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
37
Concurrency Utilities Bestandteile (1)
•
Stellt fertige Bausteine zur Verfügung
– Für alle Arten von Entwicklern (Anwendung, Server, Concurrent, ...)
•
Concurrent Collections
– Spezielle Implementierungen von Map, Set, List, Queue, Deque
•
Executor Framework
– Framework zur Ausführung asynchroner Tasks
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
38
Concurrency Utilities Bestandteile (2)
•
Synchronizers
– Hilfsklassen zur Koordination mehrerer Threads
– Semaphore, CountDownLatch, CyclicBarrier, Exchanger
•
Locks und Conditions
– Lock ist Objekt Repräsentation von synchronized
– Condtion kapselt Monitor Methoden wait(), notify und notifyAll()
•
Atomic Variables
– Atomare Manipulation einzelner Variablen
– Erlaubt Hardware Compare-And-Swap (CAS) zu nutzen
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
39
Klassiker
•
„Thread-Safe“ Datenstrukturen in Java bereits vorhanden
– Vector, Hashtable
– Synchronized Wrapper aus java.util.Collections: synchronizedList(), ...
•
Sicherheit durch Synchronisierung aller Zugriffsmethoden
– Grob granulares Locken der ganzen Collection
– Skaliert schlecht bei Zugriff aus vielen Threads („Multicore anyone?“)
•
Synchronisierung durch Client häufig notwendig
– Mehrschrittige Operationen (deleteLast, putIfAbsent, ...)
– „Fail-fast“ Iteratoren (ConcurrentModificationException)
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
40
Überraschung
List<String> ls =
Collections.synchronizedList(new ArrayList<String>());
...
// Verhalten kann undeterministisch sein
// Kann ConcurrentModificationException werfen
Iterator<String> i = ls.iterator();
while (i.hasNext()) {
foo(i.next());
}
...
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
41
Gut Ding will Weile haben
List<String> ls =
Collections.synchronizedList(new ArrayList<String>());
...
// Client synchronisiert
// Blockiert anderen Zugriff während Iteration
synchronized(ls) {
Iterator<String> i = ls.iterator();
while (i.hasNext()) {
foo(i.next());
}
}
...
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
42
Concurrent Collections
•
Unterscheidung „Thread-Safe“ und „Concurrent“
– Neue Implementierungen der klassischen Strukturen (List, Map, Set)
– Ab Java 6 auch für SortedMap und SortedSet
•
Erlauben nicht blockierenden (skalierbaren) parallelen Zugriff
– Standardfall: Paralleles Lesen aus mehreren Threads
– Nachteil: Kleinere semantische Anpassungen notwendig
•
Iteratoren „weakly consistent“ statt „fail-fast“
– Kein komplettes Locken und keine ConcurrentModificationException
– Iterator darf Änderungen seit seiner Erzeugung ignorieren
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
43
Klassiker, again
•
ConcurrentHashMap
– Fein granulareres Locken erlaubt paralleles Lesen und Schreiben
– Kein Client-Lock, dafür neue atomare Methoden (putIfAbsent, ...)
•
CopyOnWriteArrayList / CopyOnWriteArraySet
– Array basierte Liste, Veränderung führt zu neuer Array Kopie
– Ideal falls lesen deutlich häufiger als schreiben
•
ConcurrentSkipListMap (ab Java 6)
– Implementierung des SortedMap Interface
– Wird auch verwendet für ConcurrentSkipListSet
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
44
Neuzugänge vorne anstellen
•
Neues Collection Interface Queue
– Datenstruktur, die Elemente für eine Verarbeitung bereit hält
•
Neues Collection Interface BlockingQueue
– Methoden take() und put(), die bei leerer / voller Queue blockieren
– Für Erzeuger-Verbraucher Architekturen (z.B. Thread Pools)
•
Neue ColIection Interfaces Deque und BlockingDeque (ab Java 6)
– Deque steht für Double Ende QUEue
– Für „Work Sharing“ und „Work Stealing“ Architekturen
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
45
Executor Framework (1)
•
Ermöglicht asynchrones Ausführen von Tasks in Thread Pools
– Trennung von Aufgabe (Task) und deren tatsächlicher Ausführung
•
Task wird durch Interface Runnable beschrieben
– Alter Bekannter aus JDK 1.0
•
Keine Aussage wann oder wie Tasks ausgeführt wird (Execution)
– Schnittstelle nötig für Taskübergabe zur Ausführung (Submission)
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
46
Executor Framework (2)
•
Neues Interface Executor
– Executor Objekte können Tasks zur Ausführung entgegen nehmen
•
Konkrete Art der Ausführung von Implementierung abhängig
•
Executor Implementierung bestimmt „Execution Policy“
– Ressourcen Verwendung, Ausführungsreihenfolge, ...
– Execution Policy leicht konfigurierbar je nach Hardware
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
47
Executor meets Runnable
• Executor Interface
public interface Executor {
void execute(Runnable command);
}
• Runnable Interface
public interface Runnable {
void run();
}
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
48
Neues Code Idiom
• Aus alt:
new Thread(myRunnable).start()
• Mach neu:
myExecutor.execute(myRunnable)
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
49
Woher nehmen? (1)
•
Klasse ThreadPoolExecutor direkt instanziieren
– Oder Subklasse ScheduledThreadPoolExecutor
•
Utility Klasse Executors
– Analogon zu Collections Klasse des Collection Frameworks
•
Executors enthält diverse statische Factory Methoden
– Leichtes Executor Erzeugen mit gängigen Voreinstellungen
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
50
Woher nehmen? (2)
•
newFixedThreadPool(int nThreads)
– Feste Größe, ersetzt unerwartet beendete Threads
•
newCachedThreadPool()
– Unbegrenzter Größe, wächst und schrumpft nach Bedarf
•
newSingleThreadExecutor()
– Ein Arbeitsthread, Tasks werden sequentiell abgearbeitet
•
newScheduledThreadPool(int corePoolSize)
– Für verzögerte und periodische Ausführung (Timer Ersatz)
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
51
Stets zu Diensten (1)
•
Konkrete Executor Implementierung beeinflußt Anwendung
– Executor kann z.B. neue Threads erzeugen
•
Executor stellt Dienst (Service) für Anwendungen zur Verfügung
•
Verwaltung über eigene Lifecycle Methoden wünschenswert
– Dienste können gestartet und gestoppt werden
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
52
Stets zu Diensten (2)
•
Eigenes Interface ExecutorService
– Subinterface von Executor
•
ExecutorService definiert Lifecycle
– Drei Zustände: „Running“, „Shutting Down“ und „Terminated“
•
Zustandswechsel durch entsprechende Methoden
– shutdown(), shutdownNow(), awaitTermination(), ...
•
Rückgabetyp der statischen Executors Factory Methoden
– implementiert von ThreadPoolExecutor
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
53
Demo
Demo „ Concurrency Utilities“
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
54
Sekunde…
•
Wenn noch Zeit ist…
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
55
Blick in die Zukunft (1)
•
Task Abstraktion durch Runnable hat Schwächen
– Keine Ergebnisrückgabe (nur Seiteneffekte), keine checked Exceptions
•
Callable Interface für ergebnisbehaftete Tasks
public interface Callable<V> {
V call() throws Exception;
}
•
Callable Objekte ausführbar durch ExecutorService
– submit() Methoden, geben Future Objekte zurück
public interface ExecutorService { // Auszug
<T> Future<T> submit(Callable<T> task);
}
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
56
Blick in die Zukunft (2)
•
Future beinhaltet Ergebnis eines asynchronen Aufrufs (Callable)
– Ergebnis abfragbar durch Methode get()
•
Future Interface enthält auch Lebenszyklus eines Tasks
– Berechnung kann bei Zeitüberschreitung unterbrochen werden
public interface Future<V> { // Auszug
V get() throws InterruptedException, ExecutionException;
boolean cancel(boolean mayInterruptIfRunning);
}
•
Runnable können in Callable Objekte umgewandelt werden
– Util Methode callable() in Klasse Executors
– Methode submit() in Interface ExecutorService ist für Runnable überladen
– Klasse FutureTask kann Callable Objekte als Runnable wrappen
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
57
Sekunde…
•
Wenn immer noch Zeit ist…
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
58
Das leidige Dokumentieren (1)
•
Korrektes Verhalten einer Klasse ist definierbar (dokumentierbar)
– Invarianten, Postconditions, Preconditions
– Grundvoraussetzung für Aussagen über „Thread-Safety“
•
„Thread-Safe“ Klasse impliziert mehrere Dinge
– Konkurrierende Aufrufe beeinträchtigen korrektes Verhalten nicht
– Synchronisierung unnötig durch Aufrufer
•
Zwei Dokumentationsebenen (Schnittstelle vs. Implementierung)
– Schnittstelle: Ist Locken durch Client möglich?, ...
– Implementierung: Welche Locks schützen was?, ...
•
Alles andere ist raten!
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
59
Das leidige Dokumentieren (2)
•
Bisher keine definierte Art der Dokumentation
– „[...] a class must [...] document in prose [its] level of thread safety [...]“
•
Effective Java Item 52 „Document Thread Safety“
– Taxonomie zur Dokumentation von Klassen
– Immutable, T-safe, Conditionally T-safe, T-compatible, T-hostile
•
Concurrency Annotations aus „Java Concurrency in Practice“
– Klassen: @Immtuable, @ThreadSafe, @NotThreadSafe
– Felder und Methoden: @GuardedBy(String lock)
•
Bekanntestes Antibeispiel aus JDK Javadoc
– SimpleDateFormat (bis einschließlich Java 1.3)
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
60
Lint Werkzeuge
•
Werkzeug zur statischen Codeanalyse
– Ursprünglich Kommandozeilentool aus der C Welt
•
Alarmiert über verdächtige Sprachkonstrukte
– Aber nicht zwangsläufig falsche Konstrukte
•
Diverse Tools für Java verfügbar
– FindBugs, PMD, Checkstyle, ...
– JSR 305 „Annotations for Software Defect Detection“ (Einrichtung 2006)
•
FindBugs besitzt eigene Kategorie „Multithreaded correctness“
– Double-checked locking, Spin loops, Unreleased locks, ...
– Prüft auch Concurrency Annotations („Java Concurrency in Practice“)
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
61
Testen (1)
•
Concurrent Software ist schwerer testbar als sequentielle
– Fehler nicht deterministisch und schwerer reproduzierbar
•
Testcode ist ebenfalls Concurrent Software
– Tests können Fehler im Anwendungscode maskieren
•
Phänomen bekannt als „Heisenbug“
– „A bug that disappears or alters its behavior when one attempts to
probe or isolate it.“ („http://www.jargon.org“)
– Tests möglichst frei von Synchronisierung
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
62
Testen (2)
•
Concurrent Bestandteile einer Anwendung isolieren
– Häufig beschränkte Systemteile (Workflows, Pools, Queues, ...)
– Oberstes Ziel ist isolierte Testbarkeit
•
Fehler sind zufällige Ereignisse
– Testlaufzeiten erhöhen
– Zustandsraum (Ausgangszustände und Eingangsgrößen) variieren
•
Prozessorzahl der Testplattform berücksichtigen
– Zu wenig Threads verhindern Preemption und Thread-Interaktion
– Faustregel: Mehr aktive Threads als Prozessoren
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
63
Immutability
•
Bequeme Möglichkeiten Synchronisierung zu vermeiden
– Daten auf einen Thread beschränken (Thread Confinement)
– Unveränderliche Objekte verwenden (Immutability)
•
Immutable Objekte...
– können nach Erzeugung nicht verändert werden
– geben „this“ Referenz nicht während der Erzeugung weiter
– besitzen nur „final“ Felder (Initialization Safety)
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
64
Effectively immutable
•
Objekte können „Effectively immutable“ sein
– zustandsändernde Methoden nach Erzeugung nicht mehr aufrufen
– aber Objekt Veröffentlichung muß sicher sein (Safe Publication)
•
Objektreferenz werden sicher veröffentlicht in...
–
–
–
–
•
static initializer Blöcken
volatile Feldern bzw. AtomReference Objekten
final Feldern bei Erzeugung von Objekten
Lock geschützten Feldern
Danach Verwendung als de facto immutable
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
65
Literaturhinweise
•
Java Concurrency in Practice
Sprache: Englisch
Broschiert - 403 Seiten - Addison-Wesley Longman
Erscheinungsdatum: 25. Mai 2006
ISBN: 0321349601
•
Concurrent Programming in Java
Sprache: Englisch
Broschiert - 411 Seiten - Addison-Wesley Longman
Erscheinungsdatum: 31. Dezember 1999
ISBN: 0201310090
•
Effective Java. Programming Language Guide.
Sprache: Englisch
Broschiert - 252 Seiten - Addison Wesely
Erscheinungsdatum: 5. Juni 2001
ISBN: 0201310058
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
66
Links
•
Java 6 java.util.concurrent API Docs
– http://java.sun.com/javase/6/docs/api/java/util/concurrent/package-summary.html
•
Doug Lea Homepage
– http://gee.cs.oswego.edu/dl
•
JSR 166 Homepage
– http://jcp.org/en/jsr/detail?id=166
•
The Free Lunch Is Over (Online Artikel)
– http://www.gotw.ca/publications/concurrency-ddj.htm
•
FindBugs Homepage
– http://findbugs.sourceforge.net
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
67
If you remember one thing
„To summarize, don‘t reinvent the wheel.“
(Effective Java, Item 30: „Know and use the libraries“)
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
68
Vielen Dank für Ihre
Aufmerksamkeit !
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
Version: 1.2
www.oio.de
[email protected]
Papick Garcia Taboada
Software Architekt
Technologie-Scout
Beratung
Projekte
Training
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
70
Steffen Schluff
Im a pogramar
Iam a programer
I'm a programor
I write code
Beratung
Projekte
Training
Multithreading im Zeichen von Mehrkernprozessoren
© 2007 Orientation in Objects GmbH
71
Noch Fragen…
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
Version: 1.2
www.oio.de
[email protected]
„Orientierung“ in Objekten
) Akademie )
• Schulungen, Coaching,
Weiterbildungsberatung,
Train & Solve-Programme
) Beratung )
• Methoden, Standards und
Tools für die Entwicklung
von offenen, unternehmensweiten Systemen
Multithreading im Zeichen von Mehrkernprozessoren
) Projekte )
• Schlüsselfertige Realisierung
von Software
• Unterstützung laufender
Projekte
• Pilot- und Migrationsprojekte
© 2007 Orientation in Objects GmbH
73
Herunterladen