Многопоточные коллекции
Download
Report
Transcript Многопоточные коллекции
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