Post on 14-Jan-2016
description
transcript
Concurrency UtilitiesJava Advanced
Java Advanced / Concurrency Utilities 2
СПбГУ ИТМО
Georgiy Korneev
Содержание
Многопоточные коллекцииПримитивы синхронизацииАтомарные операцииБлокировкиУправление заданиямиДополнительные возможностиЗаключение
Java Advanced / Concurrency Utilities 3
СПбГУ ИТМО
Georgiy Korneev
Concurrency Utilities
Набор классов, облегчающих написание многопоточных программ
Пакет java.util.concurrent Многопоточные коллекции Примитивы синхронизации Управление заданиями
Пакет java.util.concurrent.locks Работа с блокировками
Пакет java.util.concurrent.atomic Атомарные переменные
Многопоточные коллекции
Часть 1
Java Advanced / Collections Framework 5Georgiy Korneev
Многопоточные очереди
Интерфейс BlockingQueueОтличие от обычных очередей
Возможно ограничение размера Методы добавления могут бросают
IllegalStateException Дополнительные операции
Java Advanced / Collections Framework 6Georgiy Korneev
Дополнительные операции
Добавление элемента put(E) – блокируется до появление места. offer(E, timeout, unit) – блокируется на время.
Удаление элемента take() – блокируется до появления элемента. poll(E, timeout, unit) – блокируется на время.
Получение нескольких элементов drainTo(Collection) – получение всех элементов. drainTo(Collection, max) – получение max
элементов.
Java Advanced / Collections Framework 7Georgiy Korneev
Производитель-потребитель (1)
Производительvoid run() { try { while (true) { E e; // Создание элемента queue.put(e); } } catch (InterruptedException e) { }}
Java Advanced / Collections Framework 8Georgiy Korneev
Производитель-потребитель (2)
Потребительvoid run() {
try {
while (true) {
E e = queue.take();
// Обработка элемента
}
} catch (InterruptedException e) {
}
}
Java Advanced / Collections Framework 9Georgiy Korneev
Реализации BlockingQueue
ArrayBlockingQueue – очередь на массиве LinkedBlockingQueue – очередь на списке
PriorityBlockingQueue – очередь на хипе SynchronousQueue – очередь без
"внутренности"
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
Java Advanced / Collections Framework 11Georgiy Korneev
Другие многопоточные коллекции
Коллекции с многопоточным доступом ConcurrentHashMap – отображение ConcurrentLinkedQueue – очередь на списке
Коллекции, “самокопирующиеся” при записи CopyOnWriteArrayList – список на массиве CopyOnWriteArraySet – множество на массиве
Атомарные операцииЧасть 2
Java Advanced / Collections Framework 13Georgiy Korneev
Атомарные операции
Общие операции get() – атомарное чтение set(value) – атомарная запись compareAndSet(expected, value) – сравнение и
запись weakCompareAndSet(expected, value) – слабое
сравнение и записьОперации над числами
addAndGet() / getAndAdd() getAndIncrement() / incrementAndGet() getAndDecrement() / decrementAndGet()
Java Advanced / Collections Framework 14Georgiy Korneev
Атомарные переменные
Типы AtomicBoolean AtomicInteger AtomicLong AtomicReference
Операции Обычные
Java Advanced / Collections Framework 15Georgiy Korneev
Атомарные массивы
Типы AtomicIntegerArray AtomicLongArray AtomicReferenceArray
Операции Обычные, с указанием индекса
Java Advanced / Collections Framework 16Georgiy Korneev
Атомарный доступ к полям
Типы AtomicIntegerFieldUpdater AtomicLongFieldUpdater AtomicReferenceFieldUpdater
Операции Обычные, с указанием объекта Создание newUpdater(class, fieldName)
Java Advanced / Collections Framework 17Georgiy Korneev
Помеченные ссылки
Типы AtomicMarkableReference – ссылка помеченная
флажком AtomicStampedReference – ссылка помеченная
числом
Java Advanced / Collections Framework 18Georgiy Korneev
Операции с помеченными ссылками
Чтения getReference() – прочитать ссылку getX() – прочитать пометку V get(X[] holder) – прочитать ссылку и пометку
Установки set(valueV, valueX) – установить пометку и
значение. attemptX(oldX, newX) – изменить пометку
Условной установки compareAndSet(oldV, newV, oldX, newX)
Примитивы синхронизации
Часть 3
Java Advanced / Collections Framework 20Georgiy Korneev
Примитивы синхронизации
Semaphore – семафорCyclicBarrier – многоразовый барьерCountDownLatch – защелкаExchanger – рандеву
Java Advanced / Collections Framework 21Georgiy Korneev
Семафоры
Семафор имеет емкость, указываемую при создании
Методы acquire(n?) – получить разрешение release(n?) – отдать разрешение tryAquire(n?, time?) – попробовать получить
разрешение reducePermits(n) – уменьшить количество
разрешений drainPermits() – забрать все разрешения статистика
Java Advanced / Collections Framework 22Georgiy Korneev
Барьеры
Количество потоков и действие на барьере указывается при создании
Методы await(time?) – барьер. reset() – возвращает барьер в исходное
состояние isBroken() – “сломан” ли барьер статистика
Java Advanced / Collections Framework 23Georgiy Korneev
Защелки
Высота защелки указывается при созданииМетоды
await(time?) – ждет спуска защелки. countDown() – опускает защелку на единицу. getCount() – текущая высота защелки.
Java Advanced / Collections Framework 24Georgiy Korneev
Рандеву
Позволяет потокам синхронно обмениваться объектами
Методы exchange(V x, time?) – обменяться
БлокировкиЧасть 4
Java Advanced / Collections Framework 26Georgiy Korneev
Блокировки
Интерфейс LockМетоды
lock() – захватить блокировку lockInterruptibly() – захватить блокировку tryLock(time?) – попытаться захватить
блокировку unlock() – отпустить блокировку newCondition() – создать условие
Java Advanced / Collections Framework 27Georgiy Korneev
Условия
Интерфейс Condition await(time?) – ждать условия awaitUntil(deadline) – ждать условия до
времени awaitUninterruptibly() – ждать условие signal() – подать сигнал signalAll() – подать сигнал всем
Java Advanced / Collections Framework 28Georgiy Korneev
Реализация блокировки
Класс ReentrantLockДополнительные методы
isFair() – “честность” блокировки isLocked() – блокировка занята getQueuedThreads() / getQueueLength() /
hasQueuedThread(thread) / hasQueuedThreads() – потоки, ждущие блокировку
getWaitingThreads(condition) / getWaitQueueLength(condition) – потоки, ждущие условие
Java Advanced / Collections Framework 29Georgiy Korneev
Читатели и писатели
Интерфейс ReadWriteLock Методы
readLock() – блокировка для читателей writeLock() – блокировка для писателей
Реализация ReentrantReadWriteLock
Управление заданиямиЧасть 5
Java Advanced / Collections Framework 31Georgiy Korneev
Исполнители
Интерфейс Executor execute(Runnable) – выполнить задание
Интерфейс ExecutorService submit(Runnable) – выполнить задание Future<V> submit(Callable<V>) – выполнить
функцию invokeAll(List<Callable>) – выполнить все
функции invokeAny(List<Callable>) – успешно выполнить
функцию
Java Advanced / Collections Framework 32Georgiy Korneev
Функции и результаты
Интерфейс Callable<V> – функция V call() – подсчитать функцию
Интерфейс Future<V> – результат get(timeout?) – получить результат isDone() – окончено ли выполнение cancel() – прервать выполнение isCancelled() – прервано ли выполнение
Java Advanced / Collections Framework 33Georgiy Korneev
Реализация исполнителей
Класс ThreadPoolExecutor corePoolSize – минимальное количество
потоков maxPoolSize максимальное количество
потоков blockingQueue – очередь заданий keepAliveTime – время жизни потока threadFactory – фабрика потоков …
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
Java Advanced / Collections Framework 35Georgiy Korneev
Реализация отложенного исполнения
Класс ScheduledThreadPoolExecutor
Java Advanced / Collections Framework 36Georgiy Korneev
Класс Executors
Создание привилегированных Callable Создание фабрик потоковСоздание фабрик привилегированных
потоковСоздание исполнителей с заданным
числом потоковСоздание исполнителей с неограниченным
числом потоков
Дополнительные возможности
Часть 6
Java Advanced / Collections Framework 38Georgiy Korneev
Интервалы времени
Перечисление TimeUnit SECONDS MILLISECONDS MICROSECONDS NANOSECONDS
Интервалы задаются парой Значение Единица измерения
Java Advanced / Collections Framework 39Georgiy Korneev
Очереди с задержкой
Класс DelayQueueИнтерфейс Delayed
getDelay(unit) – получить остаток задержки
ЗаключениеЧасть 7
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
Java Advanced / Collections Framework 42Georgiy Korneev
Вопросы