Многопоточность в Spring 5
Я написал статью про wait-notify примитивы. Закончил я на том, что не стоит делать свои велосипеды, а лучше использовать более высокоуровневые абстракции. Давайте посмотрим, как этот вопрос решает Srping 5.
Скачаем исходники Spring и поищем в них использование wait
, notify
.
В spring core я нашел только одно использование wait
в org.springframework.util.ConcurrencyThrottleSupport#beforeAccess
:
На мой взгляд код прекрасен. Вместо 0
используется NO_CONCURRENCY
. Мелочь, а улучшает читаемость кода.
При этом в выражении this.concurrrencyLimit > 0
константа не используется. И это логично, странно иметь что-то большее отсутствия конкурентности.
Метод beforeAccess
ждет, когда уменьшится concurrencyCount
, это происходит в методе afterAccess
, а потом пропускает поток выполняться.
Выполнение доступа к ресурсу может занимать очень долгое время и не стоит полить переменную зря.
Сейчас хорошо бы рассмотреть другой throttler, например из Guava, но я это сделаю в другой раз.