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

Нажмите для полного просмотра!
Java lecture #05 concurrency, слайд №1Java lecture #05 concurrency, слайд №2Java lecture #05 concurrency, слайд №3Java lecture #05 concurrency, слайд №4Java lecture #05 concurrency, слайд №5Java lecture #05 concurrency, слайд №6Java lecture #05 concurrency, слайд №7Java lecture #05 concurrency, слайд №8Java lecture #05 concurrency, слайд №9Java lecture #05 concurrency, слайд №10Java lecture #05 concurrency, слайд №11Java lecture #05 concurrency, слайд №12Java lecture #05 concurrency, слайд №13Java lecture #05 concurrency, слайд №14Java lecture #05 concurrency, слайд №15Java lecture #05 concurrency, слайд №16Java lecture #05 concurrency, слайд №17Java lecture #05 concurrency, слайд №18Java lecture #05 concurrency, слайд №19Java lecture #05 concurrency, слайд №20Java lecture #05 concurrency, слайд №21Java lecture #05 concurrency, слайд №22Java lecture #05 concurrency, слайд №23Java lecture #05 concurrency, слайд №24Java lecture #05 concurrency, слайд №25Java lecture #05 concurrency, слайд №26Java lecture #05 concurrency, слайд №27Java lecture #05 concurrency, слайд №28Java lecture #05 concurrency, слайд №29Java lecture #05 concurrency, слайд №30Java lecture #05 concurrency, слайд №31Java lecture #05 concurrency, слайд №32Java lecture #05 concurrency, слайд №33Java lecture #05 concurrency, слайд №34Java lecture #05 concurrency, слайд №35Java lecture #05 concurrency, слайд №36Java lecture #05 concurrency, слайд №37Java lecture #05 concurrency, слайд №38Java lecture #05 concurrency, слайд №39Java lecture #05 concurrency, слайд №40Java lecture #05 concurrency, слайд №41Java lecture #05 concurrency, слайд №42Java lecture #05 concurrency, слайд №43Java lecture #05 concurrency, слайд №44Java lecture #05 concurrency, слайд №45

Содержание

Вы можете ознакомиться и скачать презентацию на тему Java lecture #05 concurrency. Доклад-сообщение содержит 45 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Java Lecture #05

Concurrency
Saint Petersburg, 2012
Описание слайда:
Java Lecture #05 Concurrency Saint Petersburg, 2012

Слайд 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 Lock – интерфейс, обозначающий мьютекс в явном виде При этом гораздо более гибкий, чем стандартные java-мониторы Основные отличия от synchronized-блоков Вы сами создаете объект-мьютекс Вы сами решаете какие ресурсы защищать Вы сами ответственны за освобождение мьютекса Можно захватывать мьютекс в одном контексте, а отпускать в другом Реализация синхронизации на Lock’ах во многих случаях эффективнее synchronized-блоков Из за большей гибкости она позволяет накладывать более слабые условия на взаимодействия потоков Lock’и тяжелее отлаживать и диагностировать проблемы, ведь с точки зрения JVM это рядовые объекты. Для synchronized-блокировок всегда можно запросить у JVM Thread dump, который покажет все потоки и взятые ими synchronized-блокировки.

Слайд 4





Lock
Рассмотрим реализацию thread-safe счетчика с использованием Lock
В отличие от synchronized Lock является не средством языка, а обычным объектом с набором методов
В этом случае критическую секцию ограничивают операции lock() и unlock()
Описание слайда:
Lock Рассмотрим реализацию thread-safe счетчика с использованием Lock В отличие от synchronized Lock является не средством языка, а обычным объектом с набором методов В этом случае критическую секцию ограничивают операции lock() и unlock()

Слайд 5





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

Слайд 6





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

Слайд 7





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

Слайд 8





Как обеспечить atomicity и visibility без memory barrier’a?
Как обеспечить atomicity и visibility без memory barrier’a?
Compare-and-set (compare-and-swap, CAS) – инструкция, поддерживаемая на уровне процессора (lock:cmpxchg)
Она позволяет сравнить значение с содержимым памяти и при совпадении выполнить запись
Эта инструкция позволяет применять оптимистичные блокировки без переключения контекста потока при занятом ресурсе
Все Atomic-обертки содержат метод compareAndSet(…)
Описание слайда:
Как обеспечить atomicity и visibility без memory barrier’a? Как обеспечить atomicity и visibility без memory barrier’a? Compare-and-set (compare-and-swap, CAS) – инструкция, поддерживаемая на уровне процессора (lock:cmpxchg) Она позволяет сравнить значение с содержимым памяти и при совпадении выполнить запись Эта инструкция позволяет применять оптимистичные блокировки без переключения контекста потока при занятом ресурсе Все Atomic-обертки содержат метод compareAndSet(…)

Слайд 9





Atomic wrappers
Описание слайда:
Atomic wrappers

Слайд 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<T> c)
Collections.synchronizedList(List<T> list) 
Collections.synchronizedMap(Map<K,V> m)
Collections.synchronizedSet(Set<T> s) 
Они возвращают обертки над коллекциями-аргументами с синхронизированными методами
Этими методами очень удобно оборачивать уже существующие коллекции
Содержимое можно небезопасно менять путем модификации коллекции-источника
Итерирование требует внешней синхронизации на коллекции
Не очень хорошо масштабируются
Описание слайда:
Collections.synchronized…() Класс Collections содержит среди прочих методы Collections.synchronizedCollection(Collection<T> c) Collections.synchronizedList(List<T> list) Collections.synchronizedMap(Map<K,V> m) Collections.synchronizedSet(Set<T> s) Они возвращают обертки над коллекциями-аргументами с синхронизированными методами Этими методами очень удобно оборачивать уже существующие коллекции Содержимое можно небезопасно менять путем модификации коллекции-источника Итерирование требует внешней синхронизации на коллекции Не очень хорошо масштабируются

Слайд 13





Legacy implementations
HashTable<K, V> – синхронизированная реализация интерфейса Map
Все методы синхронизированы
Потребляет заметно меньше памяти, чем ConcurrentHashMap
Плохо масштабируется
Последовательности операций на HashTable могут нуждаться в дополнительной внешней синхронизации, если требуется атомарность
Vector<E> – синхронизированная реализация интерфейса List
Все методы синхронизированы
Не осуществляет копирования при записи
Не дает значительного overhead’а по памяти
Процесс итерирования требует внешней синхронизации на самой коллекции
Описание слайда:
Legacy implementations HashTable<K, V> – синхронизированная реализация интерфейса Map Все методы синхронизированы Потребляет заметно меньше памяти, чем ConcurrentHashMap Плохо масштабируется Последовательности операций на HashTable могут нуждаться в дополнительной внешней синхронизации, если требуется атомарность Vector<E> – синхронизированная реализация интерфейса List Все методы синхронизированы Не осуществляет копирования при записи Не дает значительного overhead’а по памяти Процесс итерирования требует внешней синхронизации на самой коллекции

Слайд 14





Java.util.concurrent – новые интерфейсы
Описание слайда:
Java.util.concurrent – новые интерфейсы

Слайд 15





java.util.ConcurrentMap
Любые попытки сделать реализацию Map thread-safe упираются в необходимость атомарности группы операций
Например: «Если в Map нет такого ключа, то положить его»
Требует двух операций, которые должны выполняться атомарно
Для достижения атомарности придется самостоятельно писать внешние средства синхронизации
Непонятно как увязать их с синхронизацией самой коллекции
ConcurrentMap добавляет к Map методы для обработки часто встречающихся связанных операций на Map:
V putIfAbsent(K key, V value) 
     что эквивалентно
Описание слайда:
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 oldValue, V newValue)
V replace(K key, V value)
Описание слайда:
java.util.ConcurrentMap boolean remove(Object key, Object value) boolean replace(K key, V oldValue, V newValue) V replace(K key, V value)

Слайд 17





ConcurrentHashMap
Основная thread-safe реализация интерфейса Map<K,V>
Реализует также ConcurrentMap
Внутри похожа на HashMap, но имеет дополнительные механизмы синхронизации
Масштабируется гораздо лучше HashTable, практически линейно
Не синхронизирует операции чтения
Операции чтения отражают результат последней завершенной операции записи, не учитывая те, что еще в процессе
Итераторы отображают состояние коллекции на момент создания итератора
Позволяет задавать concurrency level – размер сегмента хэш-таблицы, блокируемого на запись
Потребляет заметно больше памяти, чем HashTable
Описание слайда:
ConcurrentHashMap Основная thread-safe реализация интерфейса Map<K,V> Реализует также ConcurrentMap Внутри похожа на HashMap, но имеет дополнительные механизмы синхронизации Масштабируется гораздо лучше HashTable, практически линейно Не синхронизирует операции чтения Операции чтения отражают результат последней завершенной операции записи, не учитывая те, что еще в процессе Итераторы отображают состояние коллекции на момент создания итератора Позволяет задавать concurrency level – размер сегмента хэш-таблицы, блокируемого на запись Потребляет заметно больше памяти, чем HashTable

Слайд 18





ConcurrentHashMap
Версии реализации от 7 и ниже используют сегментированную структуру
При записи блокируется не весь Map, а один сегмент
Разрабатываемая версия 8 будет блокироваться уже на конкретных bucket’ах, а сегменты исчезнут
Описание слайда:
ConcurrentHashMap Версии реализации от 7 и ниже используют сегментированную структуру При записи блокируется не весь Map, а один сегмент Разрабатываемая версия 8 будет блокироваться уже на конкретных bucket’ах, а сегменты исчезнут

Слайд 19





ConcurrentHashMap vs HashTable
Описание слайда:
ConcurrentHashMap vs HashTable

Слайд 20





Blocking Queues
Отлично подходят для реализации шаблона Producer-Consumer
Добавляют набор блокирующих методов для работы с очередью
Могут быть Fair по отношению к использующим потокам
ArrayBlockingQueue<E> 
Ограниченная очередь на базе массива
PriorityBlockingQueue<E>
Очередь с сортировкой элементов по Comparator’у
Неограниченная очередь
SynchronousQueue<E>
Очередь из одного(!) элемента
Операция добавления блокирует до соответствующей операции чтения из другого потока
Описание слайда:
Blocking Queues Отлично подходят для реализации шаблона Producer-Consumer Добавляют набор блокирующих методов для работы с очередью Могут быть Fair по отношению к использующим потокам ArrayBlockingQueue<E> Ограниченная очередь на базе массива PriorityBlockingQueue<E> Очередь с сортировкой элементов по Comparator’у Неограниченная очередь SynchronousQueue<E> Очередь из одного(!) элемента Операция добавления блокирует до соответствующей операции чтения из другого потока

Слайд 21





Blocking queues: API reference
Описание слайда:
Blocking queues: API reference

Слайд 22





Copy-on-write
Описание слайда:
Copy-on-write

Слайд 23





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

Слайд 24





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

Слайд 25





Итераторы
Как правило итераторы коллекций из java.util.concurrent не бросают ConcurrentModificationException
Они не являются fail-fast
Они гарантированно отражают состояние коллекции на момент создания итератора
Итераторы не блокируют другие операции или итераторы на исходной коллекции
При этом они могут содержать и более поздние изменения, но это не гарантируется
Описание слайда:
Итераторы Как правило итераторы коллекций из java.util.concurrent не бросают ConcurrentModificationException Они не являются fail-fast Они гарантированно отражают состояние коллекции на момент создания итератора Итераторы не блокируют другие операции или итераторы на исходной коллекции При этом они могут содержать и более поздние изменения, но это не гарантируется

Слайд 26





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

Слайд 27





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

Слайд 28





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

Слайд 29





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

Слайд 30





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

Слайд 31





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

Слайд 32


Java lecture #05 concurrency, слайд №32
Описание слайда:

Слайд 33





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

Слайд 34





Fork/Join – это подход к написанию многопоточных программ, основанный на следующем рекурсивном алгоритме:
Fork/Join – это подход к написанию многопоточных программ, основанный на следующем рекурсивном алгоритме:
Если задача достаточно мала – выполнить её
Если нет – разбить на несколько и выполнять их, а результаты агрегировать
Для подзадач вернуться к пункту 1.
Этот подход отлично работает для большого количества однотипных задач
Описание слайда:
Fork/Join – это подход к написанию многопоточных программ, основанный на следующем рекурсивном алгоритме: Fork/Join – это подход к написанию многопоточных программ, основанный на следующем рекурсивном алгоритме: Если задача достаточно мала – выполнить её Если нет – разбить на несколько и выполнять их, а результаты агрегировать Для подзадач вернуться к пункту 1. Этот подход отлично работает для большого количества однотипных задач

Слайд 35





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

Слайд 36





Fork/Join Framework API
Интерфейс ForkJoinTask<T> представляет  собой небольшую задачу как результат декомпозиции на этапе Fork. Есть две реализации:
RecursiveAction – не возвращает результат работы для этапа Join
RecursiveTask<T> - возвращает результата типа T для использования на этапе Join
ForkJoinPool – реализация Executor’а для ForkJoinTask
В конструкторе ему можно задать размер пула, по умолчанию он равен количеству процессоров в системе
С каждым потоком связана очередь задач, пополняемая вызовами fork()
Поток исполняет их, начиная с самых новых
Если очередь заканчивается, то поток старается украсть задачи из очередей других потоков пула
Описание слайда:
Fork/Join Framework API Интерфейс ForkJoinTask<T> представляет собой небольшую задачу как результат декомпозиции на этапе Fork. Есть две реализации: RecursiveAction – не возвращает результат работы для этапа Join RecursiveTask<T> - возвращает результата типа T для использования на этапе Join ForkJoinPool – реализация Executor’а для ForkJoinTask В конструкторе ему можно задать размер пула, по умолчанию он равен количеству процессоров в системе С каждым потоком связана очередь задач, пополняемая вызовами fork() Поток исполняет их, начиная с самых новых Если очередь заканчивается, то поток старается украсть задачи из очередей других потоков пула

Слайд 37





Fork/Join Framework - Пример
Пример вычисляет N-ый член последовательности Фибоначи методом Fork/Join
Одна часть выполняется в текущем потоке, вторая – шедулится на Thread pool
Описание слайда:
Fork/Join Framework - Пример Пример вычисляет N-ый член последовательности Фибоначи методом Fork/Join Одна часть выполняется в текущем потоке, вторая – шедулится на Thread pool

Слайд 38





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

Слайд 39





ThreadLocal<T>
ThreadLocal – типизированный контейнер для объектов, ассоциирующий содержимое с текущим потоком.
Проще говоря, ThreadLocal возвращает каждому потоку свой экземпляр объекта
Пример ниже иллюстрирует самую распространенную схему использования ThreadLocal: ассоциация объекта с потоком
В данном случае с потоком ассоциируется уникальный идентификатор
Описание слайда:
ThreadLocal<T> ThreadLocal – типизированный контейнер для объектов, ассоциирующий содержимое с текущим потоком. Проще говоря, ThreadLocal возвращает каждому потоку свой экземпляр объекта Пример ниже иллюстрирует самую распространенную схему использования ThreadLocal: ассоциация объекта с потоком В данном случае с потоком ассоциируется уникальный идентификатор

Слайд 40





Semaphore
Объект, позволяющий войти в заданный участок кода не более чем n потокам одновременно
N определяется параметром конструктора
При N=1 по действию аналогичен Lock
Fairness – гарантия очередности потоков
Описание слайда:
Semaphore Объект, позволяющий войти в заданный участок кода не более чем n потокам одновременно N определяется параметром конструктора При N=1 по действию аналогичен Lock Fairness – гарантия очередности потоков

Слайд 41





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

Слайд 42





CountDownLatch - Пример
Описание слайда:
CountDownLatch - Пример

Слайд 43





CyclicBarrier
Позволяет N потокам дождаться друг друга в некоторой точке выполнения
N задается параметром конструктора
Как только все N потоков вызовут await() их разом отпустит
Описание слайда:
CyclicBarrier Позволяет N потокам дождаться друг друга в некоторой точке выполнения N задается параметром конструктора Как только все N потоков вызовут await() их разом отпустит

Слайд 44





CyclicBarrier - Пример
Описание слайда:
CyclicBarrier - Пример

Слайд 45





Library
Brian Goetz. Java concurrency in practice
Java Language Specification, глава 17
   http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html
Maurice Herlihy , Nir Shavit.
	The art of multiprocessor programming
Статьи Brian’а Goetz’а на http://www.ibm.com/developerworks 
    (например http://www.ibm.com/developerworks/ru/library/j-jtp10185/index.html)
Описание слайда:
Library Brian Goetz. Java concurrency in practice Java Language Specification, глава 17 http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html Maurice Herlihy , Nir Shavit. The art of multiprocessor programming Статьи Brian’а Goetz’а на http://www.ibm.com/developerworks (например http://www.ibm.com/developerworks/ru/library/j-jtp10185/index.html)



Похожие презентации
Mypresentation.ru
Загрузить презентацию