Явное использование механизмов блокировки

16.06.2016

Ключевое слово synchronize и объект класса ReenterantLock имеют одинаковую семантику: оба блокируют все потоки, пытающиеся выполнить критическую секцию, если некий другой поток уже вошёл в эту секцию. Это защитная стратегия, которая предполагает, что все попытки параллельного доступа являются небезопасными, но если несколько потоков одновременно лишь читают значение совместно используемой переменной, это не приносит вреда. Как следствие и synchronized, и ReenterantLock могут оказаться избыточными в плане защиты.

Класс ReenterantReadWriteLock немного сложнее в применении, что наносит небольшой ущерб производительности, так как принятие решения о разрешении выполнения потока или о его блокировке занимает больше времени, чем использование synchronized или ReenterantLock. Таким образом, здесь наблюдается своеобразный баланс между приростом производительности вследствие разрешения нескольким потокам одновременно выполнять операции чтения из совместно используемых ресурсов и потерей производительности из-за роста сложности выполнения. Удачным примером практического использования класса ReenterantReadWriteLock может служить организация параллельной работы множества читающих потоков и нескольких пишущих потоков. Разработка мобильных приложений поможет сделать жизнь более удобной и мобильной. Профессиональная команда специалистов поможет в создании качественных продуктов, понятных для пользователей.

Типичной моделью взаимодействующих потоков является модель «потребитель-производитель» {consume г-producer), когда один поток «производит» данные, а другой их «потребляет». Взаимодействуют потоки через совместно используемый список. Если список не заполнен, поток-производитель добавляет в него элементы, в то время как поток-нотребитель извлекает (читает) элементы, если список непуст. Если список заполнен, поток-производитель должен блокироваться, а если список пуст, блокироваться должен поток-потребитель.