Parallele Programmierung WS13 Prof. Fröhlich von Sven Ahlfeld Paketübersicht java.util.concurrent Standardimplementierungen von Hilfsmitteln zur nebenläufigen Programmierung java.util.concurrent.atomic Synchronisation von einzelnen Variablen java.util.concurrent.locks Differenzierte vergabe von Locks und Wartebedingungen Warum dieses Package verwenden? Reduzierter Programmieraufwand Höhere Performance Höhere Zuverlässigkeit Inhalt Keyword synchronized Keyword volatile Atomic Callable / Runnable Future V Executor(s) CyclicBarrier Locks (Concurrent Container) Keyword synchronized Ganze Methode threadsafe Teil einer Methode threadsafe Keyword volatile Synchronisation von Zugriff auf Variable -> keine threadsafty „Ist eine Variable als volatile deklariert, muss die JVM sicherstellen, dass alle zugreifenden Threads ihre Kopien aktualisieren, sobald die Variable geändert wird. „ Vorteil gegenüber synchronized: keine Code Locks Nachteil: Variable muss bei Zugriff aktualisiert werden Keyword atomic Java Spezifikation: atomic sind alle read ODER write Zugriffe auf eine Variable (außer long und double ) long / double muss mit volatile deklariert werden für atomic read / write Zugriff java.util.concurrent.atomic Lock- und Wartefrei Callable / Runnable Callable<V> Interface Methode: <V> call() kann Rückgabewert haben kann Exception werfen Runnable Interface Methode: void run() kann KEINEN Rückgabewert haben kann KEINE Exception werfen Future V A Future represents the result of an asynchronous computation. Future<Long> result; result = exe.submit(callableTask); long data = result.get() Executor Interface An object that executes submitted Runnable tasks. This interface provides a way of decoupling task submission from the mechanics of how each task will be run, including details of thread use, scheduling, etc. An Executor is normally used instead of explicitly creating threads. Aufgabe wird im rufenden Thread erledigt – Thread ist Runnable Aufgabe wird in einen Thread ausgelagert – Thread als Träger von Runnable ExecutorService Interface Executors Zur Instantiierung von Thread-Pools wird die Factory-Klasse Executors verwendet, die folgende Typen bereitstellt FixedThreadPool Ein Threadpool mit festgelegter Anzahl von Threads CachedThreadPool Dynamischer Pool, dessen Threads auf Anfrage generiert und automatisch wieder gelöscht werden, sobald einzelne Threads länger als 60 Sekunden nicht benötigt werden ScheduledThreadPool Threadpool dessen Threads nach einem Zeitplan oder periodisch aktiv werden CyclicBarrier Class java.util.concurrent.locks Locks: müssen manuell verwaltet werden starvation möglich nicht blockgebunden anpassbar an Anforderungen nicht zwangsläufig blockierend Synchronised: blockgebunden idiotensicher blockierend Concurrent Container ConcurrentHashMap<K,V> ConcurrentLinkedQueue<E> ConcurrentSkipListMap<K,V> ConcurrentSkipListSet<E> Fragen?