java, осень 2014: Многопоточность в java: средства...
DESCRIPTION
Атомарные типы. Примитивы синхронизации. Коллекции. ExecutorService. ForkJoinPool.TRANSCRIPT
![Page 1: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/1.jpg)
Многопоточность в Java:средства стандартной библиотеки
Алексей Владыкин
24 ноября 2014
Алексей Владыкин Многопоточность (2) 24 ноября 2014 1 / 28
![Page 2: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/2.jpg)
1 Атомарные типы
2 Примитивы синхронизации
3 Коллекции
4 Executors
5 Parallel Streams
Алексей Владыкин Многопоточность (2) 24 ноября 2014 2 / 28
![Page 3: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/3.jpg)
Атомарные типы
http://en.wikipedia.org/wiki/A_Boy_and_His_Atom
Алексей Владыкин Многопоточность (2) 24 ноября 2014 3 / 28
![Page 4: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/4.jpg)
Атомарные типы
Пакет java.util.concurrent.atomic
AtomicBooleanAtomicIntegerAtomicLongAtomicReference<V>
Операции:V get()void set(V newValue)boolean compareAndSet(V expect, V update)
Алексей Владыкин Многопоточность (2) 24 ноября 2014 4 / 28
![Page 5: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/5.jpg)
Атомарные типы
Примитив compareAndSet позволяет реализовывать другиеоперации
Пример из AtomicInteger:
public final int incrementAndGet () {for (;;) {
int current = get();int next = current + 1;if (compareAndSet(current , next))
return next;}
}
Алексей Владыкин Многопоточность (2) 24 ноября 2014 5 / 28
![Page 6: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/6.jpg)
Примитивы синхронизации
Алексей Владыкин Многопоточность (2) 24 ноября 2014 6 / 28
![Page 7: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/7.jpg)
Примитивы синхронизации
Semaphore
Класс java.util.concurrent.Semaphore
Ограничивает одновременный доступ к ресурсу
В отличие от synchronized-блока, одновременно могут работатьнесколько потоков (но не более заданного N)
Операции:void acquire()void release()
Алексей Владыкин Многопоточность (2) 24 ноября 2014 7 / 28
![Page 8: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/8.jpg)
Примитивы синхронизации
Semaphore semaphore = new Semaphore (10);
semaphore.acquire ();try {
// up to 10 threads may// execute this code concurrently
} finally {semaphore.release ();
}
Алексей Владыкин Многопоточность (2) 24 ноября 2014 8 / 28
![Page 9: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/9.jpg)
Примитивы синхронизации
CountDownLatch
Класс java.util.concurrent.CountDownLatch
Обеспечивает точку синхронизации между N потоками(несколько потоков могут дожидаться друг друга и потомстартовать одновременно)
Операции:void await()void countDown()
Алексей Владыкин Многопоточность (2) 24 ноября 2014 9 / 28
![Page 10: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/10.jpg)
Примитивы синхронизации
CountDownLatch latch = new CountDownLatch (10);
// this call blocks until latch.countDown ()// is called at least 10 timeslatch.await ();
Алексей Владыкин Многопоточность (2) 24 ноября 2014 10 / 28
![Page 11: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/11.jpg)
Примитивы синхронизации
CyclicBarrier
Класс java.util.concurrent.CyclicBarrier
Вариант CountDownLatch, допускающий повторное ожидание
Алексей Владыкин Многопоточность (2) 24 ноября 2014 11 / 28
![Page 12: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/12.jpg)
Примитивы синхронизации
ReentrantLock
Класс java.util.concurrent.locks.ReentrantLock
Обеспечивает взаимное исключение потоков, аналогичноеsynchronized-блокам
Операции:lock()unlock()
Алексей Владыкин Многопоточность (2) 24 ноября 2014 12 / 28
![Page 13: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/13.jpg)
Примитивы синхронизации
Lock lock = new ReentrantLock ();
lock.lock ();try {
doSomething ();} finally {
lock.unlock ();}
Алексей Владыкин Многопоточность (2) 24 ноября 2014 13 / 28
![Page 14: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/14.jpg)
Примитивы синхронизации
Condition
Класс java.util.concurrent.locks.Condition
Аналог wait/notify
Привязан к Lock’у
У одного Lock’а может быть много Condition’ов
Алексей Владыкин Многопоточность (2) 24 ноября 2014 14 / 28
![Page 15: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/15.jpg)
Примитивы синхронизации
Lock lock = new ReentrantLock ();Condition condition = lock.newCondition ();
lock.lock ();try {
while (! conditionSatisfied ()) {condition.await ();
}} finally { lock.unlock (); }
// somewhere else in our programlock.lock ();try {
condition.signal ();} finally { lock.unlock (); }
Алексей Владыкин Многопоточность (2) 24 ноября 2014 15 / 28
![Page 16: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/16.jpg)
Примитивы синхронизации
ReentrantReadWriteLock
Класс java.util.concurrent.locks.ReentrantReadWriteLock
Поддерживает разделение доступа на чтение и на запись
Алексей Владыкин Многопоточность (2) 24 ноября 2014 16 / 28
![Page 17: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/17.jpg)
Примитивы синхронизации
ReadWriteLock lock = new ReentrantReadWriteLock ();
// somewhere in our programlock.readLock (). lock ();try {
readOnlyOperation ();} finally {
lock.readLock (). unlock ();}
// somewhere else in our programlock.writeLock (). lock ();try {
modifyingOperation ();} finally {
lock.writeLock (). unlock ();}
Алексей Владыкин Многопоточность (2) 24 ноября 2014 17 / 28
![Page 18: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/18.jpg)
Коллекции
Алексей Владыкин Многопоточность (2) 24 ноября 2014 18 / 28
![Page 19: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/19.jpg)
Коллекции
Пакет java.util.concurrent
Многопоточные варианты стандартных коллекций:ConcurrentHashMapConcurrentSkipListMapConcurrentSkipListSetCopyOnWriteArrayListCopyOnWriteArraySet
Более эффективны, чем полностью синхронизованные коллекцииjava.util.Collections.synchronizedCollection()
Алексей Владыкин Многопоточность (2) 24 ноября 2014 19 / 28
![Page 20: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/20.jpg)
Коллекции
ConcurrentLinkedQueue
Класс java.util.concurrent.ConcurrentLinkedQueue<E>
Реализация очереди, поддерживающая одновременный доступ измногих потоков, при этом не использующая блокировки
Операции:boolean offer(E e)E poll()E peek()
Алексей Владыкин Многопоточность (2) 24 ноября 2014 20 / 28
![Page 21: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/21.jpg)
Коллекции
BlockingQueue
Интерфейс java.util.concurrent.BlockingQueue<E>
Очередь, поддерживающая ограничение по размеру и операцииожидания
Операции:void put(E e)E take()
Реализации:LinkedBlockingQueue, ArrayBlockingQueue, . . .
Алексей Владыкин Многопоточность (2) 24 ноября 2014 21 / 28
![Page 22: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/22.jpg)
Executors
Алексей Владыкин Многопоточность (2) 24 ноября 2014 22 / 28
![Page 23: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/23.jpg)
Executors
Класс java.util.concurrent.ExecutorService и его соседи
Инфраструктура для выполнения задач в несколько потоков
Инкапсулирует создание потоков, организацию очереди задач,распределение задач по потокам
Алексей Владыкин Многопоточность (2) 24 ноября 2014 23 / 28
![Page 24: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/24.jpg)
Executors
ExecutorService
Future<?> submit(Runnable task)
<T> Future<T> submit(Callable<T> task)
void shutdown()
List<Runnable> shutdownNow()
Алексей Владыкин Многопоточность (2) 24 ноября 2014 24 / 28
![Page 25: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/25.jpg)
Executors
Executors
Класс java.util.concurrent.Executors
ExecutorService newSingleThreadExecutor()
ExecutorService newFixedThreadPool(int nThreads)
ExecutorService newCachedThreadPool()
Алексей Владыкин Многопоточность (2) 24 ноября 2014 25 / 28
![Page 26: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/26.jpg)
Executors
ForkJoinPool
Класс java.util.concurrent.ForkJoinPool
Вариант ExecutorService, в котором выполняющиеся задачимогут динамически порождать подзадачи
Принимает на исполнение ForkJoinTask
Алексей Владыкин Многопоточность (2) 24 ноября 2014 26 / 28
![Page 27: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/27.jpg)
Parallel Streams
stream.parallel()
Возвращает stream, дальнейшие операции в котором будутисполняться параллельно
Надо следить за доступом к общим данным из передаваемых вstream операций
Алексей Владыкин Многопоточность (2) 24 ноября 2014 27 / 28
![Page 28: Java, осень 2014: Многопоточность в Java: средства стандартной библиотеки](https://reader034.vdocuments.net/reader034/viewer/2022052622/5594af391a28ab984b8b462e/html5/thumbnails/28.jpg)
Что сегодня узнали
Какие есть примитивы синхронизации, помимо встроенныхмониторов
Какие коллекции использовать в многопоточных программах
Как организовать параллельное выполнение множества задач, незанимаясь низкоуровневым программированием потоков
Алексей Владыкин Многопоточность (2) 24 ноября 2014 28 / 28