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.
Описание
-
Масштабируемые обновляемые переменные. Поддержка единого счётчика, суммы и т. п., который обновляется, возможно, множеством потоков, — распространённая проблема масштабируемости. Небольшой набор новых классов (
DoubleAccumulator,DoubleAdder,LongAccumulator,LongAdder) внутри использует методы снижения конкуренции за доступ, которые дают огромный прирост пропускной способности по сравнению с переменнымиAtomic. Это возможно благодаря ослаблению гарантий атомарности, которое допустимо в большинстве приложений. -
Добавлены возможности (и, возможно, новые API), благодаря которым
ConcurrentHashMapsи построенные на них классы удобнее использовать в качестве кэшей. Среди них — методы вычисления значений для ключей, которые отсутствуют, улучшенная поддержка просмотра и, возможно, вытеснения записей, а также улучшенная поддержка отображений с большим числом элементов. -
Добавлена функциональность и повышена производительность
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, поэтому мы, вероятно, отложим интеграцию, пока не будем больше уверены в их окончательном виде.