Nebenläufige Programmierung mit Java - Konzepte und Programmiermodelle für Multicore-Systeme

von: Jörg Hettel, Manh Tien Tran

dpunkt, 2016

ISBN: 9783960880134 , 378 Seiten

Format: PDF, ePUB

Kopierschutz: Wasserzeichen

Windows PC,Mac OSX geeignet für alle DRM-fähigen eReader Apple iPad, Android Tablet PC's Apple iPod touch, iPhone und Android Smartphones

Preis: 34,90 EUR

Mehr zum Inhalt

Nebenläufige Programmierung mit Java - Konzepte und Programmiermodelle für Multicore-Systeme


 

Vorwort

5

Inhaltsverzeichnis

9

Einführung

15

Dimensionen der Parallelität

15

Parallelität und Nebenläufigkeit

16

Die Vorteile von Nebenläufigkeit

17

Die Nachteile von Nebenläufigkeit

17

Sicherer Umgang mit Nebenläufigkeit

18

Maße für die Parallelisierung

18

Die Gesetze von Amdahl und Gustafson

18

Work-Span-Analyse

20

Parallelitätsmodelle

21

I Grundlegende Konzepte

23

Das Thread-Konzept von Java

25

Der main-Thread

25

Erzeugung und Starten von Threads

26

Thread-Erzeugung durch Vererbung

27

Thread-Erzeugung mit Runnable-Objekten

30

Der Lebenszyklus von Threads

33

Beendigung eines Threads

34

Auf das Ende eines Threads warten

35

Aktives Beenden von Threads

35

Unterbrechung mit interrupt

38

Thread-Zustände

40

Weitere Eigenschaften eines Thread-Objekts

41

Thread-Priorität

41

Daemon-Eigenschaft

42

Exception-Handler

43

Zusammenfassung

45

Konkurrierende Zugriffe auf Daten

47

Ein einleitendes Beispiel

47

Java-Speichermodell

48

Stacks und Heap

49

Speicher auf der Hardwareebene

51

Probleme mit gemeinsam nutzbaren Daten

52

Sequenzielle Konsistenz

53

Thread-sichere Daten und unveränderliche Objekte

55

Unveränderbare Objekte

56

Volatile-Attribute

57

Final-Attributte

59

Thread-lokale Daten

60

Fallstricke

63

Zusammenfassung

64

Elementare Synchronisationsmechanismen

65

Schlüsselwort synchronized

65

Synchronized-Methoden

65

Synchronized-Blöcke

67

Beispiel: Thread-sicheres Singleton

68

Monitorkonzept bei Java

70

Fallstricke

71

Zusammenfassung

76

Grundlegende Thread-Steuerung

77

Bedingungsvariablen und Signalisieren

77

Regeln zum Umgang mit wait, notify und notifyAll

83

Zusammenfassung

86

II Weiterführende Konzepte

87

Threadpools

89

Das Poolkonzept und die Klasse Executors

89

Executors mit eigener ThreadFactory

92

Explizite ThreadPoolExecutor-Erzeugung

92

Benutzerdefinierter ThreadPoolExecutor

93

Future- und Callable-Schnittstelle

94

Callable, Future und FutureTask

95

Callable, Future und ExecutorService

95

Callable und ThreadPoolExecutor

98

Callable und ScheduledThreadPoolExecutor

102

Callable und ForkJoinPool

102

Exception-Handling

104

Tipps für das Arbeiten mit Threadpools

106

Zusammenfassung

107

Atomic-Variablen

109

Compare-and-Set-Operation

110

Umgang mit Atomic-Variablen

111

Atomic-Skalare

111

Atomic-Referenzen

114

Accumulator und Adder in Java 8

116

Zusammenfassung

118

Lock-Objekte und Semaphore

119

Lock-Objekte

120

Das Lock-Interface

120

ReentrantLock

123

Das Condition-Interface

125

ReadWriteLock

129

StampedLock

131

Semaphore

134

Zusammenfassung

137

Thread-sichere Container

139

Collection-Typen

139

Thread-sichere Collections

141

Synchronisierte Collections

141

Unmodifiable Collections

143

Concurrent Collections

144

Zusammenfassung

149

III Ergänzende Synchronisationsmechanismen

151

Exchanger und BlockingQueue

153

Exchanger

153

Queues

157

Das Erzeuger-Verbraucher-Muster

160

Varianten

163

Pipeline von Erzeugern und Verbrauchern

163

Erzeuger-Verbraucher-Muster mit Empfangsbestätigung

164

Erzeuger-Verbraucher-Muster mit Work-Stealing

165

Zusammenfassung

171

CountDownLatch und CyclicBarrier

173

CountDownLatch

173

CyclicBarrier

176

Zusammenfassung

181

Phaser

183

Das Konzept des Phasers

183

Phaser als CountDownLatch

184

Phaser als CyclicBarrier

187

Phaser als variable Barriere

188

Zusammenspiel mit dem ForkJoin-Threadpool

192

Zusammenfassung

193

IV Parallelisierungsframeworks

195

Das ForkJoin-Framework

197

Grundprinzip des ForkJoin-Patterns

197

Programmiermodell

198

Einsatz von RecursiveAction

200

Einsatz von RecursiveTask

203

Einsatz von CountedCompleter

205

Work-Stealing-Verfahren

208

Zusammenfassung

211

Parallele Array- und Stream-Verarbeitung

213

Parallele Array-Verarbeitung

213

Parallele Transformation

213

Paralleles Sortieren

214

Parallele Präfixbildung

215

Funktionsprinzip der Stream-Verarbeitung

217

Funktionale Interfaces

218

Erzeugung von Streams

219

Transformations- und Manipulationsoperationen

222

Auswertungen von Streams

225

Eigenschaften und Operationsoptimierung

230

Parallele Stream-Verarbeitung: Datenparallelität

231

Arbeitsweise und korrekte Benutzung

232

Parallele Reduzierer

234

Parallele Collectoren

237

Funktionsweise von Spliteratoren

242

Benutzerdefinierte Spliteratoren

244

Zusammenfassung

249

CompletableFuture

251

CompletableFuture als Erweiterung des Future-Patterns

251

Design von asynchronen APIs

255

Asynchrone APIs mit Future

256

Asynchrone APIs mit CompletableFuture

256

Asynchrone Verarbeitung: Task-Parallelität

258

Das Starten einer asynchronen Verarbeitung

258

Definition einer asynchronen Verarbeitungskette

259

Das Arbeiten mit CompletableFutures

261

Das Konzept des CompletionStage

262

Lineare Kompositionsmöglichkeiten

263

Verzweigen und Vereinen

266

Synchronisationsbarrieren

270

Fehlerbehandlung und Abbruch einer Verarbeitung

271

Zusammenfassung

273

V Fallbeispiele

275

Asynchrones Logging

277

Lösung mit Thread-lokalen Daten

278

Verbesserte Version (Exchanger)

280

Datenstrukturen in Multithreaded-Umgebungen

285

Liste als sortierte Menge

285

Blockierende Lösungen (Locks)

290

Grobgranulare Synchronisierung

290

Feingranulare Synchronisierung

290

Optimistische Synchronisierung

293

Lockfreie Lösung (AtomicMarkableReference)

294

The Dining Philosophers Problem

301

Basisalgorithmus

302

Lösungsvarianten (Semaphore und Lock)

302

Lösung mit einem Semaphor

303

Lösung mit asymmetrischer Lock-Anforderung

304

Lösung mithilfe eines Koordinators

305

Lösung mit asymmetrischer Wait-Release-Strategie

307

Minimal aufspannende Bäume

309

Graphen und Spannbäume

309

Der Prim-Algorithmus

311

Funktionsweise des Algorithmus

311

Implementierung des Algorithmus

313

Parallelisierung (Phaser)

315

Mergesort

319

Funktionsprinzip des Algorithmus

319

Parallelisierung (ForkJoin-Framework)

321

Der k-Mean-Clusteralgorithmus

323

Der k-Mean-Algorithmus

323

Parallelisierung (Parallel Streams)

325

Datenmodell

325

Hilfsmethoden

325

Implementierung

326

Variante mit benutzerdefiniertem Collector

330

RSA-Schlüsselerzeugung

335

Verfahren für die Schlüsselerzeugung

335

Parallelisierung (CompletableFuture)

337

Threads bei JavaFX

341

Ein einfaches Beispiel

341

JavaFX-Concurrent-API

343

Handler-Konzept bei Android

349

UI-Thread und nebenläufige Aktivitäten

349

Messages, Message-Queue, Looper

350

Handler

352

Aktoren

355

Aktorenmodell

355

Beispielimplementierung mit Akka

356

Nachrichten

357

Beteiligte Aktoren

359

Starten der Anwendung

361

VI Anhang

363

Ausblick auf Java 9

365

Die Flow-Interfaces

365

Literaturverzeichnis

371

Index

371

www.dpunkt.de

0