PROGRAMMING FOR
  CONCURRENCY
      In Java
WOZU?
CPUs haben mehrere Kerne

m2b Server: 8 virtuelle

Dualcores in kommenden
mobilen Geräten

Rechenleistung nutzbar machen

vgl. Kaffee kochen
OPTIMIERUNGEN

Warnung: „The root of all evil“ (Donald Knuth)

Multiprocessing bringt neue Komplexitätsdimension

  Bugtracking wird sehr sehr schwer

  Vorher korrekter Code kann nun fehlerhaft sein

  Performance kann schlechter werden (synchronisieren)

Deswegen: Notwendigkeit durch Profiling „beweisen“
GUTE NACHRICHT
Multiprocessing wird uns geschenkt in

  Application Server (pro Request)

  Multi-Prozess Umgebung (Tomcat, MySQL, ...)

  Libraries (nicht unser Problem)

  High Level Programmierung (Garbage Collector, JIT)

Und einfacher gemacht durch

  Gute Frameworks (GCD, OpenCL, ...)
DREI VARIANTEN

Single threaded

Dual threaded

  UI mit Worker

Massiv parallel

  Große Datenmengen

  Grafikverarbeitung, AI, Data Mining
BUILDING BLOCKS

Prozesse

  besitzt eigenen privaten Speicherbereich (!)

  Ein Programm ist meist genau ein Prozess

Threads

  gehören zu einem Prozess

  mehrere Threads teilen sich Speicher
EINFACHES BEISPIEL

 Java Class: Thread

   run() und start()



 Java Interface: Runnable

   kann an Thread übergeben
   werden
PARALLELE FEHLER

Thread Interference

  bislang korrekter Code wird fehlerhaft

Memory Consistency

  Annahmen über Speicherzustände stimmen nicht mehr

(Deadlocks)

  Threads blockieren sich gegenseitig
SYNCHRONIZE

Entwickler ist für Synchronisierung
verantwortlich

  Designfehler

synchronized heißt: nur ein Thread

synchronized(Object)

Parallele Performance
KOMPLEXITÄT++

Optimales Locking

  Mehr Parallelität

  komplexer

volatile

  atomic read/write

  nicht ausreichend
HILFEN


Zustandsraum klein
halten

Immutable Objects

  keine korrupten Zustände
HILFEN

Kontrollierbare Anzahl Threads

  Thread Pool / Worker / Jobs

  Webserver Prinzip

java.util.concurrent.Executors

java.util.concurrent.ThreadPoolExecutor
CALLABLE


Pool mit 3 Threads

Callable als kleiner Job

Future<Integer>

Immutable
SUCCESS STORY


MapReduce

 funktionale
 Denkweise

 parallelisierung ist
 unabhängig
SUCCESS STORY 2

Grafikberechnungen

  800 SPUs (Radeon HD 4850)

Cuda & OpenCL

  Rechenkernel

  Große Datenmengen

  > 1 TFLOP/s
FAZIT

Regeln zur Optimierung gelten

Zustandsraum klein halten (Immutable)

An erfolgreichen Architekturen orientieren

Single-Thread Optimierungen haben Vorrang

  Java -> C vs. Single -> Multicore

  |CPUs| ist Maximum

Concurrency in java

Hinweis der Redaktion