Java Advanced Concurrency Utilities Содержание СПбГУ ИТМО Атомарные операции Блокировки Примитивы синхронизации Многопоточные коллекции Управление заданиями Дополнительные возможности Заключение Georgiy Korneev Java Advanced / Concurrency Utilities Concurrency.
Download ReportTranscript Java Advanced Concurrency Utilities Содержание СПбГУ ИТМО Атомарные операции Блокировки Примитивы синхронизации Многопоточные коллекции Управление заданиями Дополнительные возможности Заключение Georgiy Korneev Java Advanced / Concurrency Utilities Concurrency.
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
Атомарные операции
Атомарные операции
Чтение / запись get() – атомарное чтение set(value) – атомарная запись lazySet(value) – запись без барьера getAnsSet(value) – чтение и запись Проверки compareAndSet(expected, value) запись – сравнение и weakCompareAndSet(expected, value) сравнение и запись – слабое Georgiy Korneev Java Advanced / Concurrency Utilities 5
Операции над числами
Пре- операции getAndIncrement() – инкремент getAndDecrement() – декремент addAndGet() – сложение Пост- операции incrementAndGet() – инкремент decrementAndGet() – декремент getAndAdd() – сложение Georgiy Korneev Java Advanced / Concurrency Utilities 6
Атомарные переменные
Типы AtomicBoolean AtomicInteger AtomicLong AtomicReference Операции Обычные Georgiy Korneev Java Advanced / Concurrency Utilities 7
Атомарные массивы
Типы AtomicIntegerArray AtomicLongArray AtomicReferenceArray Операции Обычные, с указанием индекса length() – число элементов Georgiy Korneev Java Advanced / Concurrency Utilities 8
Атомарный доступ к полям
Типы AtomicIntegerFieldUpdater AtomicLongFieldUpdater AtomicReferenceFieldUpdater Типы полей volatile не static Операции Обычные, с указанием объекта Создание newUpdater(class, fieldName) Georgiy Korneev Java Advanced / Concurrency Utilities 9
Помеченные ссылки
Типы AtomicMarkableReference флажком – ссылка помеченная AtomicStampedReference числом – ссылка помеченная Georgiy Korneev Java Advanced / Concurrency Utilities 10
Операции с помеченными ссылками
Чтения getReference() – прочитать ссылку isMarked() / getStamp() – прочитать пометку V get(X[] holder) – прочитать ссылку и пометку Установки set(valueV, valueX) значение.
– установить пометку и attemptX(oldV, newX) – изменить пометку Условной установки compareAndSet(oldV, newV, oldX, newX) Georgiy Korneev Java Advanced / Concurrency Utilities 11
Часть 2
Блокировки
Блокировки
Интерфейс Lock Методы lock() – захватить блокировку lockInterruptibly() – захватить блокировку tryLock(time?) блокировку – попытаться захватить unlock() – отпустить блокировку newCondition() – создать условие Georgiy Korneev Java Advanced / Concurrency Utilities 13
Условия
Интерфейс Condition await(time?) – ждать условия awaitUntil(deadline) времени – ждать условия до awaitUninterruptibly() – ждать условие signal() – подать сигнал signalAll() – подать сигнал всем Georgiy Korneev Java Advanced / Concurrency Utilities 14
Особенности
Отсутствие «блочности» Hand-over-hand блокировки Необходимость явного отпускания } l.lock() try { … } finally { l.unlock() Georgiy Korneev Java Advanced / Concurrency Utilities 15
Реализация блокировки
Класс ReentrantLock Дополнительные методы isFair() – «честность» блокировки isLocked() – блокировка занята getQueuedThreads() / getQueueLength() / hasQueuedThread(thread) / hasQueuedThreads() – потоки, ждущие блокировку getWaitingThreads(condition) / getWaitQueueLength(condition) ждущие условие – потоки, Georgiy Korneev Java Advanced / Concurrency Utilities 16
Читатели и писатели
Интерфейс ReadWriteLock Методы readLock() – блокировка для читателей writeLock() – блокировка для писателей Реализация ReentrantReadWriteLock Georgiy Korneev Java Advanced / Concurrency Utilities 17
Часть 3
Примитивы синхронизации
Примитивы синхронизации
Semaphore – семафор CyclicBarrier – многоразовый барьер CountDownLatch – защелка Exchanger – рандеву Georgiy Korneev Java Advanced / Concurrency Utilities 19
Семафор
Конструктор Semaphore(n, fair?) честность – число разрешений и Методы acquire(n?) – получить разрешение release(n?) – отдать разрешение tryAquire(n?, time?) разрешение – попробовать получить reducePermits(n) разрешений drainPermits() статистика – уменьшить количество – забрать все разрешения Georgiy Korneev Java Advanced / Concurrency Utilities 20
Барьеры
Конструкторы CyclicBarrier(n, runnable?) действие на барьере – число потоков и Методы await(time?) – барьер.
reset() – возвращает барьер в исходное состояние isBroken() – «сломан» ли барьер статистикатr Georgiy Korneev Java Advanced / Concurrency Utilities 21
Защелки
Конструктор CountDownLatch(n) – высотазащелки Методы await(time?) – ждет спуска защелки countDown() – опускает защелку на единицу getCount() – текущая высота защелки Применение Инициализация Georgiy Korneev Java Advanced / Concurrency Utilities 22
Рандеву
Позволяет потокам синхронно обмениваться объектами Конструкторы Exchanger() Методы exchange(V x, time?) – обменяться Georgiy Korneev Java Advanced / Concurrency Utilities 23
Часть 4
Многопоточные коллекции
Многопоточные очереди
Интерфейсы BlockingQueue BlockingDeque Семантика чтения-записи Возможно ограничение размера
Действие Исклю чение
Вставка Чтение Удаление add(e) remove()
Значение
offer( element() peek() poll(time?)
Ожидание
е, time?) put(e) take(e) Georgiy Korneev Java Advanced / Concurrency Utilities 25
Свойства
Массовые операции remainingCapacity() – свободное место drainTo(Collection) – получение всех элементов drainTo(Collection, max) элементов – получение max Особенности Неэффективность произвольного доступа Неатомарность массовых операций Georgiy Korneev Java Advanced / Concurrency Utilities 26
Производитель-потребитель (1)
Производитель } void run() { try { while (true) { E e; // Создание элемента queue.put(e); } } } catch (InterruptedException e) { Georgiy Korneev Java Advanced / Concurrency Utilities 27
Производитель-потребитель (2)
Потребитель } void run() { try { while (true) { E e = queue.take(); // Обработка элемента } } } catch (InterruptedException e) { Georgiy Korneev Java Advanced / Concurrency Utilities 28
Реализации BlockingQueue
ArrayBlockingQueue – очередь на массиве LinkedBlockingQueue/Deque – очереди на списках PriorityBlockingQueue – очередь на хипе SynchronousQueue «внутренности» – очередь без Georgiy Korneev Java Advanced / Concurrency Utilities 29
Многопоточные отображения
Представляются интерфейсом ConcurrentMap
Другие многопоточные коллекции
Коллекции с многопоточным доступом ConcurrentHashMap – отображение ConcurrentLinkedQueue – очередь на списке ConcurrentSkipListSet/Map множество/отображение – упорядоченное Коллекции, «самокопирующиеся» при записи CopyOnWriteArrayList – список на массиве CopyOnWriteArraySet – множество на массиве Georgiy Korneev Java Advanced / Concurrency Utilities 31
Часть 5
Управление заданиями
Исполнители (1)
Интерфейс Executor execute(Runnable) – выполнить задание Возможные варианты выполнения В том же потоке Во вновь создаваемом потоке Пул потоков Наращиваемый пул потоков Georgiy Korneev Java Advanced / Concurrency Utilities 33
Функции и результаты
Интерфейс Callable
Исполнители (2)
Интерфейс ExecutorService submit(Runnable) – выполнить задание Future
Завершение работы
shutdown() – прекратить прием заданий List
Реализация исполнителей
Класс ThreadPoolExecutor corePoolSize потоков – минимальное количество maxPoolSize потоков максимальное количество blockingQueue – очередь заданий keepAliveTime – время жизни потока threadFactory – фабрика потоков … Georgiy Korneev Java Advanced / Concurrency Utilities 37
Отклонение заданий
Нет свободного потока и места в очереди Политики отклонения AbortPolicy – бросить RejectedExecutionException CallerRunsPolicy потоке – исполнить в вызывающем DiscardPolicy – проигноировать DiscardOldestPolicy – заменить самое давнее Интерфейс RejectedExecutionHandler Georgiy Korneev Java Advanced / Concurrency Utilities 38
Отложенное исполнение
Интерфейс ScheduledExecutorService schedule(callable, timeout) – исполнить через timeout schedule(runnable, timeout?) – исполнить через timeout sheduleAtFixedRate(runnable, initialDelay, period) – периодическое исполнение scheduleWithFixedDelay(runnable, initialDelay, delay) – исполнение с равными интервалами Все методы возвращают ScheduledFuture Georgiy Korneev Java Advanced / Concurrency Utilities 39
Реализация отложенного исполнения
Класс ScheduledThreadPoolExecutor Georgiy Korneev Java Advanced / Concurrency Utilities 40
Класс Executors
Создание исполнителей newCachedThreadPool() newFixedThreadPool(n) newSingleThreadExecutor() Создание фабрик потоков Класс ThreadFactory Создание привилегированных действий и фабрик потоков Наследую права создавшего Georgiy Korneev Java Advanced / Concurrency Utilities 41
Часть 6
Дополнительные возможности
Интервалы времени
Перечисление TimeUnit SECONDS MILLISECONDS MICROSECONDS NANOSECONDS Интервалы задаются парой Значение Единица измерения Georgiy Korneev Java Advanced / Concurrency Utilities 43
Очереди с задержкой
Класс DelayQueue Интерфейс Delayed getDelay(unit) – получить остаток задержки Georgiy Korneev Java Advanced / Concurrency Utilities 44
Асинхронное вычисление
Класс FutureTask Методы run() – посчитать get(timeout?) – получить результат isDone() – проверить завершение cancel() – отменить isCancelled() – проверить, что отменилось Georgiy Korneev Java Advanced / Concurrency Utilities 45
Очереди заданий
Интерфейс CompletionService Методы submit(Callable) создать задание / submit(Runnable, result) – poll(timeout?) задания / take() – получить результат Реализация ExecutorCompletionService Georgiy Korneev Java Advanced / Concurrency Utilities 46
Часть 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 / Concurrency Utilities 48
Вопросы
Georgiy Korneev Java Advanced / Concurrency Utilities 49