java, осень 2015: Многопоточность в java: средства...

27
Многопоточность в Java: средства стандартной библиотеки Алексей Владыкин 4 декабря 2015 Алексей Владыкин Многопоточность (2) 4 декабря 2015 1 / 27

Upload: cs-center

Post on 15-Apr-2017

329 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Многопоточность в Java:средства стандартной библиотеки

Алексей Владыкин

4 декабря 2015

Алексей Владыкин Многопоточность (2) 4 декабря 2015 1 / 27

Page 2: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

1 Атомарные типы

2 Примитивы синхронизации

3 Коллекции

4 Executors

5 Parallel Streams

Алексей Владыкин Многопоточность (2) 4 декабря 2015 2 / 27

Page 3: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Атомарные типы

http://en.wikipedia.org/wiki/A_Boy_and_His_Atom

Алексей Владыкин Многопоточность (2) 4 декабря 2015 3 / 27

Page 4: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Атомарные типы

Пакет java.util.concurrent.atomic

AtomicBooleanAtomicIntegerAtomicLongAtomicReference<V>

Операции:V get()void set(V newValue)boolean compareAndSet(V expect, V update)

Алексей Владыкин Многопоточность (2) 4 декабря 2015 4 / 27

Page 5: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Атомарные типы

Примитив compareAndSet позволяет реализовывать другиеоперации

Пример из AtomicInteger:

public final int incrementAndGet () {for (;;) {

int current = get();int next = current + 1;if (compareAndSet(current , next))

return next;}

}

Алексей Владыкин Многопоточность (2) 4 декабря 2015 5 / 27

Page 6: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Примитивы синхронизации

Алексей Владыкин Многопоточность (2) 4 декабря 2015 6 / 27

Page 7: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Примитивы синхронизации

Semaphore

Класс java.util.concurrent.Semaphore

Ограничивает одновременный доступ к ресурсу

В отличие от synchronized-блока, одновременно могут работатьнесколько потоков (но не более заданного N)

Операции:void acquire()void release()

Алексей Владыкин Многопоточность (2) 4 декабря 2015 7 / 27

Page 8: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Примитивы синхронизации

Semaphore semaphore = new Semaphore (10);

semaphore.acquire ();try {

// up to 10 threads may// execute this code concurrently

} finally {semaphore.release ();

}

Алексей Владыкин Многопоточность (2) 4 декабря 2015 8 / 27

Page 9: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Примитивы синхронизации

CountDownLatch

Класс java.util.concurrent.CountDownLatch

Обеспечивает точку синхронизации между N потоками(несколько потоков могут дожидаться друг друга и потомстартовать одновременно)

Операции:void await()void countDown()

Алексей Владыкин Многопоточность (2) 4 декабря 2015 9 / 27

Page 10: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Примитивы синхронизации

CountDownLatch latch = new CountDownLatch (10);

// this call blocks until latch.countDown ()// is called at least 10 timeslatch.await ();

Алексей Владыкин Многопоточность (2) 4 декабря 2015 10 / 27

Page 11: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Примитивы синхронизации

CyclicBarrier

Класс java.util.concurrent.CyclicBarrier

Вариант CountDownLatch, допускающий повторное ожидание

Алексей Владыкин Многопоточность (2) 4 декабря 2015 11 / 27

Page 12: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Примитивы синхронизации

ReentrantLock

Класс java.util.concurrent.locks.ReentrantLock

Обеспечивает взаимное исключение потоков, аналогичноеsynchronized-блокам

Операции:lock()unlock()

Алексей Владыкин Многопоточность (2) 4 декабря 2015 12 / 27

Page 13: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Примитивы синхронизации

Lock lock = new ReentrantLock ();

lock.lock ();try {

doSomething ();} finally {

lock.unlock ();}

Алексей Владыкин Многопоточность (2) 4 декабря 2015 13 / 27

Page 14: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Примитивы синхронизации

Condition

Класс java.util.concurrent.locks.Condition

Аналог wait/notify

Привязан к Lock’у

У одного Lock’а может быть много Condition’ов

Алексей Владыкин Многопоточность (2) 4 декабря 2015 14 / 27

Page 15: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Примитивы синхронизации

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) 4 декабря 2015 15 / 27

Page 16: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Примитивы синхронизации

ReentrantReadWriteLock

Класс java.util.concurrent.locks.ReentrantReadWriteLock

Поддерживает разделение доступа на чтение и на запись

Алексей Владыкин Многопоточность (2) 4 декабря 2015 16 / 27

Page 17: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Примитивы синхронизации

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) 4 декабря 2015 17 / 27

Page 18: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Коллекции

Алексей Владыкин Многопоточность (2) 4 декабря 2015 18 / 27

Page 19: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Коллекции

Пакет java.util.concurrent

Многопоточные варианты стандартных коллекций:ConcurrentHashMapConcurrentSkipListMapConcurrentSkipListSetCopyOnWriteArrayListCopyOnWriteArraySet

Более эффективны, чем полностью синхронизованные коллекцииjava.util.Collections.synchronizedCollection()

Алексей Владыкин Многопоточность (2) 4 декабря 2015 19 / 27

Page 20: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Коллекции

ConcurrentLinkedQueue

Класс java.util.concurrent.ConcurrentLinkedQueue<E>

Реализация очереди, поддерживающая одновременный доступ измногих потоков, при этом не использующая блокировки

Операции:boolean offer(E e)E poll()E peek()

Алексей Владыкин Многопоточность (2) 4 декабря 2015 20 / 27

Page 21: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Коллекции

BlockingQueue

Интерфейс java.util.concurrent.BlockingQueue<E>

Очередь, поддерживающая ограничение по размеру и операцииожидания

Операции:void put(E e)E take()

Реализации:LinkedBlockingQueue, ArrayBlockingQueue, . . .

Алексей Владыкин Многопоточность (2) 4 декабря 2015 21 / 27

Page 22: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Executors

Алексей Владыкин Многопоточность (2) 4 декабря 2015 22 / 27

Page 23: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Executors

Класс java.util.concurrent.ExecutorService и его соседи

Инфраструктура для выполнения задач в несколько потоков

Инкапсулирует создание потоков, организацию очереди задач,распределение задач по потокам

Алексей Владыкин Многопоточность (2) 4 декабря 2015 23 / 27

Page 24: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Executors

ExecutorService

Future<?> submit(Runnable task)

<T> Future<T> submit(Callable<T> task)

void shutdown()

List<Runnable> shutdownNow()

Алексей Владыкин Многопоточность (2) 4 декабря 2015 24 / 27

Page 25: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Executors

Executors

Класс java.util.concurrent.Executors

ExecutorService newSingleThreadExecutor()

ExecutorService newFixedThreadPool(int nThreads)

ExecutorService newCachedThreadPool()

Алексей Владыкин Многопоточность (2) 4 декабря 2015 25 / 27

Page 26: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Executors

ForkJoinPool

Класс java.util.concurrent.ForkJoinPool

Вариант ExecutorService, в котором выполняющиеся задачимогут динамически порождать подзадачи

Принимает на исполнение ForkJoinTask

Алексей Владыкин Многопоточность (2) 4 декабря 2015 26 / 27

Page 27: Java, осень 2015: Многопоточность в Java: средства стандартной библиотеки

Parallel Streams

stream.parallel()

Возвращает stream, дальнейшие операции в котором будутисполняться параллельно

Надо следить за доступом к общим данным из передаваемых вstream операций

Алексей Владыкин Многопоточность (2) 4 декабря 2015 27 / 27