openjdk.ruOpenJDK на русском

JEP 155: Concurrency Updates

Обновления средств конкурентности

АвторDoug Lea
ОтветственныйChris Hegarty
ТипFeature
ОбластьSE
СтатусClosed / Delivered
Выпуск8
Компонентcore-libs
Обсуждениеcore dash libs dash dev at openjdk dot java dot net
БлокируетJEP 103: Parallel Array Sorting
Зависит отJEP 109: Enhance Core Libraries with Lambda
JEP 126: Lambda Expressions & Virtual Extension Methods
ОдобренBrian Goetz
Создан2012/04/21 20:00
Обновлён2017/08/13 17:12
Задача8046145

Аннотация

Масштабируемые обновляемые переменные, улучшения API ConcurrentHashMap, ориентированные на использование в качестве кэша, улучшения ForkJoinPool, а также дополнительные классы Lock и Future.

Мотивация

Способы использования конкурентности и параллелизма в приложениях непрерывно развиваются, и поддержка в библиотеках должна развиваться вместе с ними. Вся описанная здесь работа основана на опыте и предложениях пользователей пакета java.util.concurrent.

Описание

  1. Масштабируемые обновляемые переменные. Поддержка единого счётчика, суммы и т. п., который обновляется, возможно, множеством потоков, — распространённая проблема масштабируемости. Небольшой набор новых классов (DoubleAccumulator, DoubleAdder, LongAccumulator, LongAdder) внутри использует методы снижения конкуренции за доступ, которые дают огромный прирост пропускной способности по сравнению с переменными Atomic. Это возможно благодаря ослаблению гарантий атомарности, которое допустимо в большинстве приложений.

  2. Добавлены возможности (и, возможно, новые API), благодаря которым ConcurrentHashMaps и построенные на них классы удобнее использовать в качестве кэшей. Среди них — методы вычисления значений для ключей, которые отсутствуют, улучшенная поддержка просмотра и, возможно, вытеснения записей, а также улучшенная поддержка отображений с большим числом элементов.

  3. Добавлена функциональность и повышена производительность ForkJoinPool, чтобы их можно было эффективнее применять во всё более широком круге приложений, который нужен пользователям. Новые возможности включают, среди прочего, поддержку архитектур на основе завершения (completion-based), которые часто лучше всего подходят для задач, ограниченных вводом-выводом.

Возможные дальнейшие дополнения включают новые классы Lock и Future, а также пересмотр связанных с ними средств, которые упрощают создание фреймворков STM (Software Transactional Memory, программная транзакционная память). Однако поддержка STM как таковая не является целью для JDK 8.

Ранние версии этих компонентов (а также другие небольшие обновления прочих компонентов) публиковались и продолжают публиковаться вне OpenJDK, чтобы до интеграции в JDK 8 получить первые отзывы и отчёты об опыте использования (в основном от опытных пользователей). Исходный код и обсуждения в рассылке можно найти по ссылкам на странице http://gee.cs.oswego.edu/dl/concurrency-interest/index.html

Тестирование

Мы (постоянный состав участников JSR 166) предоставляем функциональные тесты и тесты производительности для всех компонентов.

Риски и допущения

Мы предполагаем, что инженеры Oracle продолжат помогать с интеграцией в JDK 8.

Зависимости

Некоторые возможности зависят от синтаксиса лямбда-выражений и объявлений распространённых функциональных типов в JDK, поэтому мы, вероятно, отложим интеграцию, пока не будем больше уверены в их окончательном виде.