Top Banner
Concurrency Utilities Java Advanced
42

Concurrency Utilities

Jan 14, 2016

Download

Documents

thuy

Java Advanced. Concurrency Utilities. Содержание. Многопоточные коллекции Примитивы синхронизации Атомарные операции Блокировки Управление заданиями Дополнительные возможности Заключение. Concurrency Utilities. Набор классов, облегчающих написание многопоточных программ - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Concurrency Utilities

Concurrency UtilitiesJava Advanced

Page 2: Concurrency Utilities

Java Advanced / Concurrency Utilities 2

СПбГУ ИТМО

Georgiy Korneev

Содержание

Многопоточные коллекцииПримитивы синхронизацииАтомарные операцииБлокировкиУправление заданиямиДополнительные возможностиЗаключение

Page 3: Concurrency Utilities

Java Advanced / Concurrency Utilities 3

СПбГУ ИТМО

Georgiy Korneev

Concurrency Utilities

Набор классов, облегчающих написание многопоточных программ

Пакет java.util.concurrent Многопоточные коллекции Примитивы синхронизации Управление заданиями

Пакет java.util.concurrent.locks Работа с блокировками

Пакет java.util.concurrent.atomic Атомарные переменные

Page 4: Concurrency Utilities

Многопоточные коллекции

Часть 1

Page 5: Concurrency Utilities

Java Advanced / Collections Framework 5Georgiy Korneev

Многопоточные очереди

Интерфейс BlockingQueueОтличие от обычных очередей

Возможно ограничение размера Методы добавления могут бросают

IllegalStateException Дополнительные операции

Page 6: Concurrency Utilities

Java Advanced / Collections Framework 6Georgiy Korneev

Дополнительные операции

Добавление элемента put(E) – блокируется до появление места. offer(E, timeout, unit) – блокируется на время.

Удаление элемента take() – блокируется до появления элемента. poll(E, timeout, unit) – блокируется на время.

Получение нескольких элементов drainTo(Collection) – получение всех элементов. drainTo(Collection, max) – получение max

элементов.

Page 7: Concurrency Utilities

Java Advanced / Collections Framework 7Georgiy Korneev

Производитель-потребитель (1)

Производительvoid run() { try { while (true) { E e; // Создание элемента queue.put(e); } } catch (InterruptedException e) { }}

Page 8: Concurrency Utilities

Java Advanced / Collections Framework 8Georgiy Korneev

Производитель-потребитель (2)

Потребительvoid run() {

try {

while (true) {

E e = queue.take();

// Обработка элемента

}

} catch (InterruptedException e) {

}

}

Page 9: Concurrency Utilities

Java Advanced / Collections Framework 9Georgiy Korneev

Реализации BlockingQueue

ArrayBlockingQueue – очередь на массиве LinkedBlockingQueue – очередь на списке

PriorityBlockingQueue – очередь на хипе SynchronousQueue – очередь без

"внутренности"

Page 10: Concurrency Utilities

Java Advanced / Collections Framework 10Georgiy Korneev

Многопоточные отображения

Представляются интерфейсом ConcurrentMap<K, V>

Дополнительные методы putIfAbsent(K, V) – добавляет отображение K,

если его ранее не было remove(K, V) – удаляет K, если он отображен

на V replace(K, V) – заменяет отображение K replace(K, oldV, newV) – условная замена

отображения для ключа K

Page 11: Concurrency Utilities

Java Advanced / Collections Framework 11Georgiy Korneev

Другие многопоточные коллекции

Коллекции с многопоточным доступом ConcurrentHashMap – отображение ConcurrentLinkedQueue – очередь на списке

Коллекции, “самокопирующиеся” при записи CopyOnWriteArrayList – список на массиве CopyOnWriteArraySet – множество на массиве

Page 12: Concurrency Utilities

Атомарные операцииЧасть 2

Page 13: Concurrency Utilities

Java Advanced / Collections Framework 13Georgiy Korneev

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

Общие операции get() – атомарное чтение set(value) – атомарная запись compareAndSet(expected, value) – сравнение и

запись weakCompareAndSet(expected, value) – слабое

сравнение и записьОперации над числами

addAndGet() / getAndAdd() getAndIncrement() / incrementAndGet() getAndDecrement() / decrementAndGet()

Page 14: Concurrency Utilities

Java Advanced / Collections Framework 14Georgiy Korneev

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

Типы AtomicBoolean AtomicInteger AtomicLong AtomicReference

Операции Обычные

Page 15: Concurrency Utilities

Java Advanced / Collections Framework 15Georgiy Korneev

Атомарные массивы

Типы AtomicIntegerArray AtomicLongArray AtomicReferenceArray

Операции Обычные, с указанием индекса

Page 16: Concurrency Utilities

Java Advanced / Collections Framework 16Georgiy Korneev

Атомарный доступ к полям

Типы AtomicIntegerFieldUpdater AtomicLongFieldUpdater AtomicReferenceFieldUpdater

Операции Обычные, с указанием объекта Создание newUpdater(class, fieldName)

Page 17: Concurrency Utilities

Java Advanced / Collections Framework 17Georgiy Korneev

Помеченные ссылки

Типы AtomicMarkableReference – ссылка помеченная

флажком AtomicStampedReference – ссылка помеченная

числом

Page 18: Concurrency Utilities

Java Advanced / Collections Framework 18Georgiy Korneev

Операции с помеченными ссылками

Чтения getReference() – прочитать ссылку getX() – прочитать пометку V get(X[] holder) – прочитать ссылку и пометку

Установки set(valueV, valueX) – установить пометку и

значение. attemptX(oldX, newX) – изменить пометку

Условной установки compareAndSet(oldV, newV, oldX, newX)

Page 19: Concurrency Utilities

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

Часть 3

Page 20: Concurrency Utilities

Java Advanced / Collections Framework 20Georgiy Korneev

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

Semaphore – семафорCyclicBarrier – многоразовый барьерCountDownLatch – защелкаExchanger – рандеву

Page 21: Concurrency Utilities

Java Advanced / Collections Framework 21Georgiy Korneev

Семафоры

Семафор имеет емкость, указываемую при создании

Методы acquire(n?) – получить разрешение release(n?) – отдать разрешение tryAquire(n?, time?) – попробовать получить

разрешение reducePermits(n) – уменьшить количество

разрешений drainPermits() – забрать все разрешения статистика

Page 22: Concurrency Utilities

Java Advanced / Collections Framework 22Georgiy Korneev

Барьеры

Количество потоков и действие на барьере указывается при создании

Методы await(time?) – барьер. reset() – возвращает барьер в исходное

состояние isBroken() – “сломан” ли барьер статистика

Page 23: Concurrency Utilities

Java Advanced / Collections Framework 23Georgiy Korneev

Защелки

Высота защелки указывается при созданииМетоды

await(time?) – ждет спуска защелки. countDown() – опускает защелку на единицу. getCount() – текущая высота защелки.

Page 24: Concurrency Utilities

Java Advanced / Collections Framework 24Georgiy Korneev

Рандеву

Позволяет потокам синхронно обмениваться объектами

Методы exchange(V x, time?) – обменяться

Page 25: Concurrency Utilities

БлокировкиЧасть 4

Page 26: Concurrency Utilities

Java Advanced / Collections Framework 26Georgiy Korneev

Блокировки

Интерфейс LockМетоды

lock() – захватить блокировку lockInterruptibly() – захватить блокировку tryLock(time?) – попытаться захватить

блокировку unlock() – отпустить блокировку newCondition() – создать условие

Page 27: Concurrency Utilities

Java Advanced / Collections Framework 27Georgiy Korneev

Условия

Интерфейс Condition await(time?) – ждать условия awaitUntil(deadline) – ждать условия до

времени awaitUninterruptibly() – ждать условие signal() – подать сигнал signalAll() – подать сигнал всем

Page 28: Concurrency Utilities

Java Advanced / Collections Framework 28Georgiy Korneev

Реализация блокировки

Класс ReentrantLockДополнительные методы

isFair() – “честность” блокировки isLocked() – блокировка занята getQueuedThreads() / getQueueLength() /

hasQueuedThread(thread) / hasQueuedThreads() – потоки, ждущие блокировку

getWaitingThreads(condition) / getWaitQueueLength(condition) – потоки, ждущие условие

Page 29: Concurrency Utilities

Java Advanced / Collections Framework 29Georgiy Korneev

Читатели и писатели

Интерфейс ReadWriteLock Методы

readLock() – блокировка для читателей writeLock() – блокировка для писателей

Реализация ReentrantReadWriteLock

Page 30: Concurrency Utilities

Управление заданиямиЧасть 5

Page 31: Concurrency Utilities

Java Advanced / Collections Framework 31Georgiy Korneev

Исполнители

Интерфейс Executor execute(Runnable) – выполнить задание

Интерфейс ExecutorService submit(Runnable) – выполнить задание Future<V> submit(Callable<V>) – выполнить

функцию invokeAll(List<Callable>) – выполнить все

функции invokeAny(List<Callable>) – успешно выполнить

функцию

Page 32: Concurrency Utilities

Java Advanced / Collections Framework 32Georgiy Korneev

Функции и результаты

Интерфейс Callable<V> – функция V call() – подсчитать функцию

Интерфейс Future<V> – результат get(timeout?) – получить результат isDone() – окончено ли выполнение cancel() – прервать выполнение isCancelled() – прервано ли выполнение

Page 33: Concurrency Utilities

Java Advanced / Collections Framework 33Georgiy Korneev

Реализация исполнителей

Класс ThreadPoolExecutor corePoolSize – минимальное количество

потоков maxPoolSize максимальное количество

потоков blockingQueue – очередь заданий keepAliveTime – время жизни потока threadFactory – фабрика потоков …

Page 34: Concurrency Utilities

Java Advanced / Collections Framework 34Georgiy Korneev

Отложенное исполнение

Интерфейс ScheduledExecutorService schedule(callable, timeout) – исполнить через

timeout schedule(runnable, timeout?) – исполнить через

timeout sheduleAtFixedRate(runnable, initialDelay, period,

unit) – периодическое исполнение scheduleWithFixedDelay(runnable, initialDelay,

delay, unit) – исполнение с равными интервалами

Все методы возвращают ScheduledFuture

Page 35: Concurrency Utilities

Java Advanced / Collections Framework 35Georgiy Korneev

Реализация отложенного исполнения

Класс ScheduledThreadPoolExecutor

Page 36: Concurrency Utilities

Java Advanced / Collections Framework 36Georgiy Korneev

Класс Executors

Создание привилегированных Callable Создание фабрик потоковСоздание фабрик привилегированных

потоковСоздание исполнителей с заданным

числом потоковСоздание исполнителей с неограниченным

числом потоков

Page 37: Concurrency Utilities

Дополнительные возможности

Часть 6

Page 38: Concurrency Utilities

Java Advanced / Collections Framework 38Georgiy Korneev

Интервалы времени

Перечисление TimeUnit SECONDS MILLISECONDS MICROSECONDS NANOSECONDS

Интервалы задаются парой Значение Единица измерения

Page 39: Concurrency Utilities

Java Advanced / Collections Framework 39Georgiy Korneev

Очереди с задержкой

Класс DelayQueueИнтерфейс Delayed

getDelay(unit) – получить остаток задержки

Page 40: Concurrency Utilities

ЗаключениеЧасть 7

Page 41: Concurrency Utilities

Java Advanced / Collections Framework 41Georgiy Korneev

Ссылки

JSR 166: Concurrency Utilities // http://jcp.org/en/jsr/detail?id=166

Concurrent Programming with J2SE 5.0 // http://java.sun.com/developer/technicalArticles/J2SE/concurrency/

Getting to know synchronizers http://java.sun.com/developer/JDCTechTips/2005/tt0216.html#1

Page 42: Concurrency Utilities

Java Advanced / Collections Framework 42Georgiy Korneev

Вопросы