Java Advanced Concurrency Utilities Содержание СПбГУ ИТМО Атомарные операции  Блокировки  Примитивы синхронизации  Многопоточные коллекции  Управление заданиями  Дополнительные возможности  Заключение  Georgiy Korneev Java Advanced / Concurrency Utilities Concurrency.

Download Report

Transcript 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  Дополнительные методы     putIfAbsent(K, V) – добавляет отображение K , если его ранее не было remove(K, V) на V – удаляет K , если он отображен replace(K, V) – заменяет отображение K replace(K, oldV, newV) – условная замена отображения для ключа K Georgiy Korneev Java Advanced / Concurrency Utilities 30

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

 Коллекции с многопоточным доступом    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 – функция  V call() – подсчитать функцию  Интерфейс Future – результат   get(timeout?) – получить результат isDone() – окончено ли выполнение   cancel(mayInterruptWhenRunning) выполнение – прервать isCancelled() – прервано ли выполнение Georgiy Korneev Java Advanced / Concurrency Utilities 34

Исполнители (2)

 Интерфейс ExecutorService  submit(Runnable) – выполнить задание    Future submit(Callable) функцию – выполнить List invokeAll(List) выполнить все функции – Future invokeAny(List) выполнить функцию – успешно Georgiy Korneev Java Advanced / Concurrency Utilities 35

Завершение работы

 shutdown() – прекратить прием заданий  List shutdownNow() прекратить выполнение –  isShutdown() – прекращен ли прием  isTerminated() – окончен ли все задания  awaitTermination(timeout) завершения – ожидание Georgiy Korneev Java Advanced / Concurrency Utilities 36

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

 Класс 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