Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему Java lecture #05 concurrency

Содержание

AgendaПримитивы синхронизацииThread-safe коллекцииПланировщики и пулы потоковFork/Join FrameworkУтилитные классы
Saint Petersburg, 2012Java Lecture #05  Concurrency AgendaПримитивы синхронизацииThread-safe коллекцииПланировщики и пулы потоковFork/Join FrameworkУтилитные классы Lock – интерфейс, обозначающий мьютекс в явном видеПри этом гораздо более гибкий, LockРассмотрим реализацию thread-safe счетчика с использованием LockВ отличие от synchronized Lock является LockНаиболее распространенный паттерн   для работы с Lock’ами представлен Lock fairnessFairness (равнодоступность) – свойство Lock’a, при котором при освобождении управление отдается Lock – масштабируемостьТест для измерения относительной масштабируемости synchronized в сравнении с Lock, использует генератор Как обеспечить atomicity и visibility без memory barrier’a?Compare-and-set (compare-and-swap, CAS) – инструкция, Atomic wrappersОбертки над примитивными типамиAtomicIntegerAtomicLongAtomicBooleanAtomicReferenceПредоставляют реализации CAS-операцийСодержат набор полезных атомарных операцийboolean compareAndSet(int Atomic wrappers - пример AgendaПримитивы синхронизацииThread-safe коллекцииПланировщики и пулы потоковFork/Join FrameworkУтилитные классы Collections.synchronized…()Класс Collections содержит среди прочих методыCollections.synchronizedCollection(Collection c)Collections.synchronizedList(List list) Collections.synchronizedMap(Map m)Collections.synchronizedSet(Set s) Они Legacy implementationsHashTable – синхронизированная реализация интерфейса MapВсе методы синхронизированыПотребляет заметно меньше памяти, Java.util.concurrent – новые интерфейсы java.util.ConcurrentMapЛюбые попытки сделать реализацию Map thread-safe упираются в необходимость атомарности группы операцийНапример: java.util.ConcurrentMapboolean remove(Object key, Object value)boolean replace(K key, V oldValue, V newValue)V replace(K key, V value) ConcurrentHashMapОсновная thread-safe реализация интерфейса MapРеализует также ConcurrentMapВнутри похожа на HashMap, но имеет ConcurrentHashMapВерсии реализации от 7 и ниже используют сегментированную структуруПри записи блокируется не ConcurrentHashMap vs HashTableHashTable блокирует всю таблицу целиком, ограничивая вертикальную масштабируемостьС какого-то момента Blocking QueuesОтлично подходят для реализации шаблона Producer-ConsumerДобавляют набор блокирующих методов для работы Blocking queues: API reference Copy-on-writeCopyOnWriteArrayList и CopyOnWriteArraySet основаны на массиве, копируемом при операции записиУже открытые итераторы Copy-on-write - РеализацияИ её реализация в CopyOnWriteArrayList:Операция добавления элемента в список: Skip ListsConcurrentSkipListMap и ConcurrentSkipListSet основаны на Skip List’ахЭто единственные доступные thread-safe реализации ИтераторыКак правило итераторы коллекций из java.util.concurrent не бросают ConcurrentModificationExceptionОни не являются fail-fastОни ИтераторыВыполнение этого кода приводит к ConcurrentModificationExceptionЕсли заменить реализацию на CopyOnWriteArrayList, то исключения не будет AgendaПримитивы синхронизацииThread-safe коллекцииПланировщики и пулы потоковFork/Join FrameworkУтилитные классы CallableИмеет единственный метод V call()По принципу действия схож с Runnable Executor Executor – интерфейс, обозначающий абстрактную систему для асинхронного исполнения задачВ него ExecutorServiceПредставляет собой расширение Executor’а с дополнительными возможностямиСпособен создавать объекты Future, представляющие собой FutureFuture – интерфейс, семантически обозначающий результат выполнения асинхронной операцииТип-параметр – это тип Future - Пример AgendaПримитивы синхронизацииThread-safe коллекцииПланировщики и пулы потоковFork/Join FrameworkУтилитные классы Fork/Join – это подход к написанию многопоточных программ, основанный на следующем рекурсивном Fork/Join FrameworkНачиная с Java 7 в стандартные библиотеки Java включен Fork/Join Framework, Fork/Join Framework APIИнтерфейс ForkJoinTask представляет собой небольшую задачу как результат декомпозиции на Fork/Join Framework - ПримерПример вычисляет N-ый член последовательности Фибоначи методом Fork/JoinОдна часть AgendaПримитивы синхронизацииThread-safe коллекцииПланировщики и пулы потоковFork/Join FrameworkУтилитные классы ThreadLocalThreadLocal – типизированный контейнер для объектов, ассоциирующий содержимое с текущим потоком.Проще говоря, SemaphoreОбъект, позволяющий войти в заданный участок кода не более чем n потокам CountDownLatchОн предоставляет две основные операции:countDown() – уменьшает значение счетчика на единицуawait() – CountDownLatch - Пример CyclicBarrierПозволяет N потокам дождаться друг друга в некоторой точке выполненияN задается параметром CyclicBarrier - Пример LibraryBrian Goetz. Java concurrency in practiceJava Language Specification, глава 17  http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.htmlMaurice
Слайды презентации

Слайд 2 Agenda
Примитивы синхронизации
Thread-safe коллекции
Планировщики и пулы потоков
Fork/Join Framework
Утилитные классы

AgendaПримитивы синхронизацииThread-safe коллекцииПланировщики и пулы потоковFork/Join FrameworkУтилитные классы

Слайд 3 Lock – интерфейс, обозначающий мьютекс в явном виде
При

Lock – интерфейс, обозначающий мьютекс в явном видеПри этом гораздо более

этом гораздо более гибкий, чем стандартные java-мониторы
Основные отличия от

synchronized-блоков
Вы сами создаете объект-мьютекс
Вы сами решаете какие ресурсы защищать
Вы сами ответственны за освобождение мьютекса
Можно захватывать мьютекс в одном контексте, а отпускать в другом
Реализация синхронизации на Lock’ах во многих случаях эффективнее synchronized-блоков
Из за большей гибкости она позволяет накладывать более слабые условия на взаимодействия потоков
Lock’и тяжелее отлаживать и диагностировать проблемы, ведь с точки зрения JVM это рядовые объекты. Для synchronized-блокировок всегда можно запросить у JVM Thread dump, который покажет все потоки и взятые ими synchronized-блокировки.

Lock



Слайд 4 Lock
Рассмотрим реализацию thread-safe счетчика с использованием Lock
В отличие

LockРассмотрим реализацию thread-safe счетчика с использованием LockВ отличие от synchronized Lock

от synchronized Lock является не средством языка, а обычным

объектом с набором методов
В этом случае критическую секцию ограничивают операции lock() и unlock()

Вызов lock() блокирует, если Lock в данный момент занят, поэтому удобно использовать метод tryLock(), который сразу вернет управление и результат
При использовании Lock не будут работать стандартные методы wait(), notify() и notifyAll(), ведь монитор как таковой не используется
Вместо них используются реализации интерфейса Condition, ассоциированные с Lock: необходимо вызвать Lock.newCondition() и уже у Condition вызывать методы await(), signal() и signalAll()
С одним Lock можно ассоциировать несколько Condition


Слайд 5 Lock
Наиболее распространенный паттерн
для работы

LockНаиболее распространенный паттерн  для работы с Lock’ами представлен  справаОн

с Lock’ами представлен
справа
Он гарантирует, что Lock

будет отпущен в
любом случае, даже если при работе с
ресурсом будет выброшено исключение
Для synchronized этот подход неактуален – там средствами языка предоставляется гарантия, что мьютекс будет отпущен
Этот паттерн весьма полезен в любой ситуации, требующей обязательного освобождения ресурсов
Широко используются две основные реализации Lock:
ReentrantLock допускает вложенные критические секции
ReadWriteLock имеет разные механизмы блокировки на чтение и запись, позволяя уменьшить накладные расходы

Слайд 6 Lock fairness
Fairness (равнодоступность) – свойство Lock’a, при котором

Lock fairnessFairness (равнодоступность) – свойство Lock’a, при котором при освобождении управление

при освобождении управление отдается тому из ожидающих потоков, который

ждет дольше всех
Fairness не распространяется на действия собственно планировщика потоков
Fair Locks менее производительны, но более предсказуемы, чем Unfair
 В действительности равнодоступность блокировок - очень сильное требование и достигается за счет значительных потерь в производительности
Учет использования системных ресурсов и синхронизация, необходимые для обеспечения равнодоступности означают, что соперничающие равнодоступные блокировки будут иметь гораздо более низкую пропускную способность, чем неравнодоступные
По умолчанию следует установить для равнодоступности значение false, если для правильности вашего алгоритма не критично, чтобы потоки обслуживались точно в порядке очереди.
Блокировки на synchronized изначально unfair и нет способа изменить это поведение

Слайд 7 Lock – масштабируемость
Тест для измерения относительной масштабируемости synchronized в

Lock – масштабируемостьТест для измерения относительной масштабируемости synchronized в сравнении с Lock, использует

сравнении с Lock, использует генератор псевдослучайных чисел (PRNG).
Диаграммы показывают

пропускную способность в вызовах в секунду, нормализованную до случая synchronized с одним потоком для различных реализаций.
Как видно, реализация основанная на Lock гораздо лучше масштабируется
Тест наглядно показывает, что Fair Lock – достаточно дорогое удовольствие

Слайд 8 Как обеспечить atomicity и visibility без memory barrier’a?
Compare-and-set

Как обеспечить atomicity и visibility без memory barrier’a?Compare-and-set (compare-and-swap, CAS) –

(compare-and-swap, CAS) – инструкция, поддерживаемая на уровне процессора (lock:cmpxchg)
Она

позволяет сравнить значение с содержимым памяти и при совпадении выполнить запись
Эта инструкция позволяет применять оптимистичные блокировки без переключения контекста потока при занятом ресурсе
Все Atomic-обертки содержат метод compareAndSet(…)

Принцип работы CAS в псевдокоде:
CAS на многопроцессорных машинах будет дороже из-за аппаратной реализации атомарности операции

Compare-And-Set


Слайд 9 Atomic wrappers
Обертки над примитивными типами
AtomicInteger
AtomicLong
AtomicBoolean
AtomicReference
Предоставляют реализации CAS-операций
Содержат набор

Atomic wrappersОбертки над примитивными типамиAtomicIntegerAtomicLongAtomicBooleanAtomicReferenceПредоставляют реализации CAS-операцийСодержат набор полезных атомарных операцийboolean

полезных атомарных операций
boolean compareAndSet(int expect, int update)
int incrementAndGet()
int getAndIncrement()
int

getAndSet(int newValue)
int addAndGet(int delta)
boolean weakCompareAndSet(int expect, int update)


Слайд 10 Atomic wrappers - пример

Atomic wrappers - пример

Слайд 11 Agenda
Примитивы синхронизации
Thread-safe коллекции
Планировщики и пулы потоков
Fork/Join Framework
Утилитные классы

AgendaПримитивы синхронизацииThread-safe коллекцииПланировщики и пулы потоковFork/Join FrameworkУтилитные классы

Слайд 12 Collections.synchronized…()
Класс Collections содержит среди прочих методы
Collections.synchronizedCollection(Collection c)
Collections.synchronizedList(List list)

Collections.synchronized…()Класс Collections содержит среди прочих методыCollections.synchronizedCollection(Collection c)Collections.synchronizedList(List list) Collections.synchronizedMap(Map m)Collections.synchronizedSet(Set s)


Collections.synchronizedMap(Map m)
Collections.synchronizedSet(Set s)
Они возвращают обертки над коллекциями-аргументами с

синхронизированными методами
Этими методами очень удобно оборачивать уже существующие коллекции
Содержимое можно небезопасно менять путем модификации коллекции-источника
Итерирование требует внешней синхронизации на коллекции
Не очень хорошо масштабируются


Слайд 13 Legacy implementations
HashTable – синхронизированная реализация интерфейса Map
Все

Legacy implementationsHashTable – синхронизированная реализация интерфейса MapВсе методы синхронизированыПотребляет заметно меньше

методы синхронизированы
Потребляет заметно меньше памяти, чем ConcurrentHashMap
Плохо масштабируется
Последовательности операций

на HashTable могут нуждаться в дополнительной внешней синхронизации, если требуется атомарность
Vector – синхронизированная реализация интерфейса List
Все методы синхронизированы
Не осуществляет копирования при записи
Не дает значительного overhead’а по памяти
Процесс итерирования требует внешней синхронизации на самой коллекции

Слайд 14 Java.util.concurrent – новые интерфейсы

Java.util.concurrent – новые интерфейсы

Слайд 15 java.util.ConcurrentMap
Любые попытки сделать реализацию Map thread-safe упираются в

java.util.ConcurrentMapЛюбые попытки сделать реализацию Map thread-safe упираются в необходимость атомарности группы

необходимость атомарности группы операций
Например: «Если в Map нет такого

ключа, то положить его»
Требует двух операций, которые должны выполняться атомарно
Для достижения атомарности придется самостоятельно писать внешние средства синхронизации
Непонятно как увязать их с синхронизацией самой коллекции
ConcurrentMap добавляет к Map методы для обработки часто встречающихся связанных операций на Map:
V putIfAbsent(K key, V value)
что эквивалентно



Слайд 16 java.util.ConcurrentMap
boolean remove(Object key, Object value)




boolean replace(K key, V

java.util.ConcurrentMapboolean remove(Object key, Object value)boolean replace(K key, V oldValue, V newValue)V replace(K key, V value)

oldValue, V newValue)




V replace(K key, V value)


Слайд 17 ConcurrentHashMap
Основная thread-safe реализация интерфейса Map
Реализует также ConcurrentMap
Внутри похожа

ConcurrentHashMapОсновная thread-safe реализация интерфейса MapРеализует также ConcurrentMapВнутри похожа на HashMap, но

на HashMap, но имеет дополнительные механизмы синхронизации
Масштабируется гораздо лучше

HashTable, практически линейно
Не синхронизирует операции чтения
Операции чтения отражают результат последней завершенной операции записи, не учитывая те, что еще в процессе
Итераторы отображают состояние коллекции на момент создания итератора
Позволяет задавать concurrency level – размер сегмента хэш-таблицы, блокируемого на запись
Потребляет заметно больше памяти, чем HashTable


Слайд 18 ConcurrentHashMap
Версии реализации от 7 и ниже используют сегментированную

ConcurrentHashMapВерсии реализации от 7 и ниже используют сегментированную структуруПри записи блокируется

структуру
При записи блокируется не весь Map, а один сегмент
Разрабатываемая

версия 8 будет блокироваться уже на конкретных bucket’ах, а сегменты исчезнут

Слайд 19 ConcurrentHashMap vs HashTable

HashTable блокирует всю таблицу целиком, ограничивая

ConcurrentHashMap vs HashTableHashTable блокирует всю таблицу целиком, ограничивая вертикальную масштабируемостьС какого-то

вертикальную масштабируемость
С какого-то момента добавление новых ядер уже не

дает прироста производительности

Слайд 20 Blocking Queues

Отлично подходят для реализации шаблона Producer-Consumer
Добавляют набор

Blocking QueuesОтлично подходят для реализации шаблона Producer-ConsumerДобавляют набор блокирующих методов для

блокирующих методов для работы с очередью
Могут быть Fair по

отношению к использующим потокам
ArrayBlockingQueue
Ограниченная очередь на базе массива
PriorityBlockingQueue
Очередь с сортировкой элементов по Comparator’у
Неограниченная очередь
SynchronousQueue
Очередь из одного(!) элемента
Операция добавления блокирует до соответствующей операции чтения из другого потока


Интерфейс BlockingDeueue расширяет BlockingQueue методами работы с обоими концами структуры



Слайд 21 Blocking queues: API reference

Blocking queues: API reference

Слайд 22 Copy-on-write

CopyOnWriteArrayList и CopyOnWriteArraySet основаны на массиве, копируемом при

Copy-on-writeCopyOnWriteArrayList и CopyOnWriteArraySet основаны на массиве, копируемом при операции записиУже открытые

операции записи
Уже открытые итераторы при этом не увидят изменений

в коллекции
Эти коллекции следует использовать только когда 90+% операций являются операциями чтения
При частых операциях модификации большая коллекция способна убить производительность
Сортировка этих коллекций не поддерживается, т.к. она подразумевает O(n) операций вставки
Итераторы по этим коллекциям не поддерживают операций модификации

Слайд 23 Copy-on-write - Реализация
И её реализация в CopyOnWriteArrayList:
Операция добавления

Copy-on-write - РеализацияИ её реализация в CopyOnWriteArrayList:Операция добавления элемента в список:

элемента в список:


Слайд 24 Skip Lists
ConcurrentSkipListMap и ConcurrentSkipListSet основаны на Skip List’ах
Это

Skip ListsConcurrentSkipListMap и ConcurrentSkipListSet основаны на Skip List’ахЭто единственные доступные thread-safe

единственные доступные thread-safe реализации NavigableSet и NavigableMap
Skip List, как

правило, занимает больше памяти, чем хэш-таблица
Гарантирует O(log(n)) для большинства операций
ConcurrentSkipListMap, в отличие от ConcurrentHashMap, не предоставляет средств для performance-тюнинга
ConcurrentSkipListMap также реализует ConcurrentMap
Это единственные упорядоченные thread-safe коллекции

Слайд 25 Итераторы
Как правило итераторы коллекций из java.util.concurrent не бросают

ИтераторыКак правило итераторы коллекций из java.util.concurrent не бросают ConcurrentModificationExceptionОни не являются

ConcurrentModificationException
Они не являются fail-fast
Они гарантированно отражают состояние коллекции на

момент создания итератора
Итераторы не блокируют другие операции или итераторы на исходной коллекции
При этом они могут содержать и более поздние изменения, но это не гарантируется

Слайд 26 Итераторы
Выполнение этого кода приводит к ConcurrentModificationException
Если заменить реализацию

ИтераторыВыполнение этого кода приводит к ConcurrentModificationExceptionЕсли заменить реализацию на CopyOnWriteArrayList, то исключения не будет

на CopyOnWriteArrayList, то исключения не будет


Слайд 27 Agenda
Примитивы синхронизации
Thread-safe коллекции
Планировщики и пулы потоков
Fork/Join Framework
Утилитные классы

AgendaПримитивы синхронизацииThread-safe коллекцииПланировщики и пулы потоковFork/Join FrameworkУтилитные классы

Слайд 28 Callable
Имеет единственный метод V call()
По принципу действия схож

CallableИмеет единственный метод V call()По принципу действия схож с Runnable

с Runnable




Слайд 29 Executor
Executor – интерфейс, обозначающий абстрактную систему для

Executor Executor – интерфейс, обозначающий абстрактную систему для асинхронного исполнения задачВ

асинхронного исполнения задач
В него передают исполняемый код, а он

заботится о выборе потока для исполнения
При этом он может содержать несколько потоков, обеспечивая их эффективное переиспользование
Класс Executors представляет собой фабрику для создания Executor’ов
Эта фабрика позволяет создавать разнообразные очереди и пулы потоков, избавляя программиста от необходимости писать однообразный инфраструктурный код
Простой пример использования Executor’а представлен ниже

Слайд 30 ExecutorService
Представляет собой расширение Executor’а с дополнительными возможностями
Способен создавать

ExecutorServiceПредставляет собой расширение Executor’а с дополнительными возможностямиСпособен создавать объекты Future, представляющие

объекты Future, представляющие собой результаты выполнения асинхронных операций
Основные методы:
Submit(…)

– различные варианты этого метода принимают задачу на выполнение
invokeAll()- метод выполнит переданный в него список задач и вернет управление тогда, когда все задачи будут завершены или наступит таймаут
invokeAny()- метод выполнит переданный в него список задач и вернет управление тогда, когда хотя бы одна задача будет завершена или наступит таймаут
shutdown() – при вызове этого метода ExecutorService закончит выполнение текущих задач, но новых принимать уже не будет
Многие Executor’ы, возвращаемые фабрикой Executors на самом деле являются реализациями ExecutorService




Слайд 31 Future
Future – интерфейс, семантически обозначающий результат выполнения асинхронной

FutureFuture – интерфейс, семантически обозначающий результат выполнения асинхронной операцииТип-параметр – это

операции
Тип-параметр – это тип результата операции
Важные методы интерфейса
get() позволяет

получить результат операции, блокируя, если результата еще нет
cancel() останавливает выполнение задачи, если только она еще не завершена
isDone() позволяет определить, завершена ли задача
Все операции в рамках выполнения задачи happens-before любых операций после вызова метода get()
Самой распространенной реализацией Future является FutureTask
FutureTask также реализует Runnable, так что его экземпляры удобно передавать в Thread или Executor

Слайд 32 Future - Пример

Future - Пример

Слайд 33 Agenda
Примитивы синхронизации
Thread-safe коллекции
Планировщики и пулы потоков
Fork/Join Framework
Утилитные классы

AgendaПримитивы синхронизацииThread-safe коллекцииПланировщики и пулы потоковFork/Join FrameworkУтилитные классы

Слайд 34 Fork/Join – это подход к написанию многопоточных программ,

Fork/Join – это подход к написанию многопоточных программ, основанный на следующем

основанный на следующем рекурсивном алгоритме:
Если задача достаточно мала –

выполнить её
Если нет – разбить на несколько и выполнять их, а результаты агрегировать
Для подзадач вернуться к пункту 1.
Этот подход отлично работает для большого количества однотипных задач

Схема справа представляет
собой типовое дерево задач,
полученное в результате
декомпозиции

Fork/Join


Слайд 35 Fork/Join Framework
Начиная с Java 7 в стандартные библиотеки

Fork/Join FrameworkНачиная с Java 7 в стандартные библиотеки Java включен Fork/Join

Java включен Fork/Join Framework, который предоставляет инфраструктуру для подобной

декомпозиции
Изначально он входил в JSR-166, который описывал практически все содержимое пакета java.util.concurrent
Тем не менее, ему потребовалось еще 6 лет, чтобы попасть в мейнстрим
При этом существует много сторонних реализаций Fork/Join, например Tymeac


Слайд 36 Fork/Join Framework API
Интерфейс ForkJoinTask представляет собой небольшую задачу

Fork/Join Framework APIИнтерфейс ForkJoinTask представляет собой небольшую задачу как результат декомпозиции

как результат декомпозиции на этапе Fork. Есть две реализации:
RecursiveAction

– не возвращает результат работы для этапа Join
RecursiveTask - возвращает результата типа T для использования на этапе Join
ForkJoinPool – реализация Executor’а для ForkJoinTask
В конструкторе ему можно задать размер пула, по умолчанию он равен количеству процессоров в системе
С каждым потоком связана очередь задач, пополняемая вызовами fork()
Поток исполняет их, начиная с самых новых
Если очередь заканчивается, то поток старается украсть задачи из очередей других потоков пула




Слайд 37 Fork/Join Framework - Пример
Пример вычисляет N-ый член последовательности

Fork/Join Framework - ПримерПример вычисляет N-ый член последовательности Фибоначи методом Fork/JoinОдна

Фибоначи методом Fork/Join
Одна часть выполняется в текущем потоке, вторая

– шедулится на Thread pool

Слайд 38 Agenda
Примитивы синхронизации
Thread-safe коллекции
Планировщики и пулы потоков
Fork/Join Framework
Утилитные классы

AgendaПримитивы синхронизацииThread-safe коллекцииПланировщики и пулы потоковFork/Join FrameworkУтилитные классы

Слайд 39 ThreadLocal
ThreadLocal – типизированный контейнер для объектов, ассоциирующий содержимое

ThreadLocalThreadLocal – типизированный контейнер для объектов, ассоциирующий содержимое с текущим потоком.Проще

с текущим потоком.
Проще говоря, ThreadLocal возвращает каждому потоку свой

экземпляр объекта
Пример ниже иллюстрирует самую распространенную схему использования ThreadLocal: ассоциация объекта с потоком
В данном случае с потоком ассоциируется уникальный идентификатор

Слайд 40 Semaphore
Объект, позволяющий войти в заданный участок кода не

SemaphoreОбъект, позволяющий войти в заданный участок кода не более чем n

более чем n потокам одновременно
N определяется параметром конструктора
При N=1

по действию аналогичен Lock
Fairness – гарантия очередности потоков



Слайд 41 CountDownLatch

Он предоставляет две основные операции:
countDown() – уменьшает значение

CountDownLatchОн предоставляет две основные операции:countDown() – уменьшает значение счетчика на единицуawait()

счетчика на единицу
await() – текущий поток будет заблокирован пока

значение счетчика не упадет до нуля
Перезапустить CountDownLatch нельзя

Утилитный класс для синхронизации действий потоков
Представляет собой барьер, на котором потоки ждут некоторого события
В основе лежит счетчик, который можно уменьшать от начального значения до нуля


Слайд 42 CountDownLatch - Пример

CountDownLatch - Пример

Слайд 43 CyclicBarrier
Позволяет N потокам дождаться друг друга в некоторой

CyclicBarrierПозволяет N потокам дождаться друг друга в некоторой точке выполненияN задается

точке выполнения
N задается параметром конструктора
Как только все N потоков

вызовут await() их разом отпустит

Опционально можно задать некий Runnable, который будет выполнен в момент разблокировки
CyclicBarrier можно перезапустить методом reset()


Слайд 44 CyclicBarrier - Пример

CyclicBarrier - Пример

  • Имя файла: java-lecture-05-concurrency.pptx
  • Количество просмотров: 100
  • Количество скачиваний: 0