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

advertisement
Java Advanced
Многопоточное
программирование.
Concurrency Utilities
Содержание
СПбГУ ИТМО
Многопоточные коллекции
 Примитивы синхронизации
 Атомарный операции
 Блокировки
 Управление заданиями
 Дополнительные возможности
 Заключение

Georgiy Korneev
Java Advanced / Concurrency Utilities
2
Concurrency Utilities
СПбГУ ИТМО


Набор классов, облегчающих написание
многопоточных программ
Пакет java.util.concurrent




Пакет java.util.concurrent.locks


Многопоточные коллекции
Примитивы синхронизации
Управление заданиями
Работа с блокировками
Пакет java.util.concurrent.atomic

Атомарные переменные
Georgiy Korneev
Java Advanced / Concurrency Utilities
3
Часть 1
Многопоточные
коллекции
Многопоточные очереди


Интерфейс BlockingQueue
Отличие от обычных очередей



Возможно ограничение размера
Методы добавления могут бросают
IllegalStateException
Дополнительные операции
Georgiy Korneev
Java Advanced / Collections Framework
5
Дополнительные операции

Добавление элемента



Удаление элемента



put(E) – блокируется до появление места.
offer(E, timeout, unit) – блокируется на время.
take() – блокируется до появления элемента.
poll(E, timeout, unit) – блокируется на время.
Получение нескольких элементов


drainTo(Collection) – получение всех элементов.
drainTo(Collection, max) – получение max
элементов.
Georgiy Korneev
Java Advanced / Collections Framework
6
Производитель-потребитель (1)

Производитель
void run() {
try {
while (true) {
E e;
// Создание элемента
queue.put(e);
}
} catch (InterruptedException e) {
}
}
Georgiy Korneev
Java Advanced / Collections Framework
7
Производитель-потребитель (2)

Потребитель
void run() {
try {
while (true) {
E e = queue.take();
// Обработка элемента
}
} catch (InterruptedException e) {
}
}
Georgiy Korneev
Java Advanced / Collections Framework
8
Реализации BlockingQueue
ArrayBlockingQueue – очередь на массиве
 LinkedBlockingQueue – очередь на списке
 PriorityBlockingQueue – очередь на хипе
 DelayQueue – очередь элементов в
задержкой
 SynchronousQueue – очередь без
"внутренности"

Georgiy Korneev
Java Advanced / Collections Framework
9
Многопоточные отображения
Представляются интерфейсом
ConcurrentMap<K, V>
 Дополнительные методы





putIfAbsent(K, V) – добавляет отображение K,
если его ранее не было
remove(K, V) – удаляет K, если он отображен
на V
replace(K, V) – заменяет отображение K
replace(K, oldV, newV) – условная замена
отображения для ключа K
Georgiy Korneev
Java Advanced / Collections Framework
10
Другие многопоточные коллекции

Коллекции с многопоточным доступом



ConcurrentHashMap – отображение
ConcurrentLinkedQueue – очередь на списке
Коллекции, “самокопирующиеся” при
записи


CopyOnWriteArrayList – список на массиве
CopyOnWriteArraySet – множество на массиве
Georgiy Korneev
Java Advanced / Collections Framework
11
Часть 2
Атомарные операции
Атомарные операции

Общие операции





get() – атомарное чтение
set(value) – атомарная запись
compareAndSet(expected, value) – сравнение и
запись
weakCompareAndSet(expected, value) – слабое
сравнение и запись
Операции над числами



addAndGet() / getAndAdd()
addAndIncrement() / incrementAndAdd()
addAndDecrement() / decrementAndAdd()
Georgiy Korneev
Java Advanced / Collections Framework
13
Атомарные переменные

Типы





AtomicBoolean
AtomicInteger
AtomicLong
AtomicReference
Операции

Обычные
Georgiy Korneev
Java Advanced / Collections Framework
14
Атомарные массивы

Типы




AtomicIntegerArray
AtomicLongArray
AtomicReferenceArray
Операции

Обычные, с указанием индекса
Georgiy Korneev
Java Advanced / Collections Framework
15
Атомарный доступ к полям

Типы




AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
AtomicReferenceFieldUpdater
Операции


Обычные, с указанием объекта
Создание newUpdater(class, fieldName)
Georgiy Korneev
Java Advanced / Collections Framework
16
Помеченные ссылки

Типы


AtomicMarkableReference – ссылка помеченная
флажком
AtomicStampedReference – ссылка помеченная
числом
Georgiy Korneev
Java Advanced / Collections Framework
17
Операции с помеченными ссылками

Чтения




Установки



getReference() – прочитать ссылку
getX() – прочитать пометку
V get(X[] holder) – прочитать ссылку и пометку
set(valueV, valueX) – установить пометку и
значение.
attemptX(oldX, newX) – изменить пометку
Условной установки

compareAndSet(oldV, newV, oldX, newX)
Georgiy Korneev
Java Advanced / Collections Framework
18
Часть 3
Примитивы
синхронизации
Примитивы синхронизации
Semaphore – семафор
 CyclicBarrier – многоразовый барьер
 CountDownLatch – защелка
 Exchanger – рандеву

Georgiy Korneev
Java Advanced / Collections Framework
20
Семафоры


Семафор имеет емкость, указываемую
при создании
Методы






acquire(n?) – получить разрешение
release(n?) – отдать разрешение
tryAquire(n?, time?) – попробовать получить
разрешение
reducePermits(n) – уменьшить количество
разрешений
drainPermits() – забрать все разрешения
статистика
Georgiy Korneev
Java Advanced / Collections Framework
21
Барьеры
Количество потоков и действие на барьере
указывается при создании
 Методы





await(time?) – барьер.
reset() – возвращает барьер в исходное
состояние
isBroken() – “сломан” ли барьер
статистика
Georgiy Korneev
Java Advanced / Collections Framework
22
Защелки


Высота защелки указывается при создании
Методы



await(time?) – ждет спуска защелки.
countDown() – опускает защелку на единицу.
getCount() – текущая высота защелки.
Georgiy Korneev
Java Advanced / Collections Framework
23
Рандеву
Позволяет потокам синхронно
обмениваться объектами
 Методы


exchange(V x, time?) – обменяться
Georgiy Korneev
Java Advanced / Collections Framework
24
Часть 4
Блокировки
Блокировки


Интерфейс Lock
Методы





lock() – захватить блокировку
lockInterruptibly() – захватить блокировку
tryLock(time?) – попытаться захватить
блокировку
unlock() – отпустить блокировку
newCondition() – создать условие
Georgiy Korneev
Java Advanced / Collections Framework
26
Условия

Интерфейс Condition





await(time)? – ждать условия
awaitUntil(deadline) – ждать условия до
времени
awaitUninterruptibly() – ждать условие
signal() – подать сигнал
signalAll() – подать сигнал всем
Georgiy Korneev
Java Advanced / Collections Framework
27
Реализация блокировки


Класс ReentrantLock
Дополнительные методы




isFair() – “честность” блокировки
isLocked() – блокировка занята
getQueuedThreads() / getQueueLength() /
hasQueuedThread(thread) / hasQueuedThreads()
– потоки, ждущие блокировку
getWaitingThreads(condition) /
getWaitQueueLength(condition) – потоки,
ждущие условие
Georgiy Korneev
Java Advanced / Collections Framework
28
Читатели и писатели


Интерфейс ReadWriteLock
Методы



readLock() – блокировка для читателей
writeLock() – блокировка для писателей
Реализация ReentrantReadWriteLock
Georgiy Korneev
Java Advanced / Collections Framework
29
Часть 5
Управление заданиями
Исполнители

Интерфейс Executor


execute(Runnable) – выполнить задание
Интерфейс ExecutorService




submit(Runnable) – выполнить задание
Future<V> submit(Callable<V>) – выполнить
функцию
invokeAll(List<Callable>) – выполнить все
функции
invokeAny(List<Callable>) – успешно выполнить
функцию
Georgiy Korneev
Java Advanced / Collections Framework
31
Функции и результаты

Интерфейс Callable<V> – функция


V call() – подсчитать функцию
Интерфейс Future<V> – результат




get(timeout?) – получить результат
isDone() – окончено ли выполнение
cancel() – прервать выполнение
isCancelled() – прервано ли выполнение
Georgiy Korneev
Java Advanced / Collections Framework
32
Реализация исполнителей

Класс ThreadPoolExecutor






corePoolSize – минимальное количество
потоков
maxPoolSize максимальное количество
потоков
blockingQueue – очередь заданий
keepAliveTime – время жизни потока
threadFactory – фабрика потоков
…
Georgiy Korneev
Java Advanced / Collections Framework
33
Отложенное исполнение

Интерфейс ScheduledExecutorService





schedule(callable, timeout) – исполнить через
timeout
schedule(runnable, timeout?) – исполнить через
timeout
sheduleAtFixedRate(runnable, initialDelay, period,
unit) – периодическое исполнение
scheduleWithFixedDelay(runnable, initialDelay,
delay, unit) – исполнение с равными
интервалами
Все методы возвращают ScheduledFuture
Georgiy Korneev
Java Advanced / Collections Framework
34
Реализация отложенного исполнения

Класс ScheduledThreadPoolExecutor
Georgiy Korneev
Java Advanced / Collections Framework
35
Класс Executors
Создание привилегированных Callable
 Создание фабрик потоков
 Создание фабрик привилегированных
потоков
 Создание исполнителей с заданным
числом потоков
 Создание исполнителей с неограниченным
числом потоков

Georgiy Korneev
Java Advanced / Collections Framework
36
Часть 6
Дополнительные
возможности
Интервалы времени

Перечисление TimeUnit





SECONDS
MILLISECONDS
MICROSECONDS
NANOSECONDS
Интервалы задаются парой


Значение
Единица измерения
Georgiy Korneev
Java Advanced / Collections Framework
38
Очереди с задержкой


Класс DelayQueue
Интерфейс Delayed

getDelay(unit) – получить остаток задержки
Georgiy Korneev
Java Advanced / Collections Framework
39
Часть 7
Заключение
Ссылки

JSR 166: Concurrency Utilities //
http://jcp.org/en/jsr/detail?id=166
 Concurrent Programming with J2SE 5.0 //
http://java.sun.com/developer/technicalArticle
s/J2SE/concurrency/
 Getting to know synchronizers
http://java.sun.com/developer/JDCTechTips/2
005/tt0216.html#1
Georgiy Korneev
Java Advanced / Collections Framework
41
Вопросы
Georgiy Korneev
Java Advanced / Collections Framework
42
Download