powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Не пойму, каков контракт у ReentrantReadWriteLock?
5 сообщений из 5, страница 1 из 1
Не пойму, каков контракт у ReentrantReadWriteLock?
    #38015360
Dims
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пойму, какова идеология работы класса ReentrantReadWriteLock? У него есть два лока, для чтения и для записи. Кто может захватить лок и в каких случаях? Например, если какой-то поток держит лок чтения, то может ли другой поток захватить лок записи?

Если "нет", тогда получается, что никакого преимущества два лока не дают, потому что записывающий поток всё равно ждёт, пока читающих освободит ресурс. То же самое было бы и с одним общим локом.

А если "да", тогда получается, что читающий поток может выполнять чтение параллельно с тем, как записывающий поток выполняет запись. И почему это не приводит к гонке данных?
...
Рейтинг: 0 / 0
Не пойму, каков контракт у ReentrantReadWriteLock?
    #38015484
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimsНе пойму, какова идеология работы класса ReentrantReadWriteLock? У него есть два лока, для чтения и для записи. Кто может захватить лок и в каких случаях? Например, если какой-то поток держит лок чтения, то может ли другой поток захватить лок записи?

Если другой поток держит лок чтения, то мы ждем, пока эта операция завершится, а т.к. внутри при этом обновляется счетчик запросов на запись. то после выхода из чтения лок будет захвачен записыващим потоком, а читатели будут ждать.
Но ввиду того, что RW предназначен для сценария, когда записывающих потоков мало, то ожиданием завершения операция чтения можно пренебречь.
DimsЕсли "нет", тогда получается, что никакого преимущества два лока не дают, потому что записывающий поток всё равно ждёт, пока читающих освободит ресурс. То же самое было бы и с одним общим локом.
RW лок ничем не лучше "толстого" лока в ситуациях, когда число записывающих тредов велико, но он для таких ситуаций не предназначен.
DimsА если "да", тогда получается, что читающий поток может выполнять чтение параллельно с тем, как записывающий поток выполняет запись. И почему это не приводит к гонке данных?

Читающий поток не может вообще никак читать параллельно записывающему т.к. это нарушает контракт RW лока в котором сказано, что читатели ждут писателей.
...
Рейтинг: 0 / 0
Не пойму, каков контракт у ReentrantReadWriteLock?
    #38016420
Dims
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaЧитающий поток не может вообще никак читать параллельно записывающему т.к. это нарушает контракт RW лока в котором сказано, что читатели ждут писателей.
Меня интересует, как ждут писатели. Допустим, писатель один, а читателей 100. Если писатель ждёт, то он может ждать очень долго!
...
Рейтинг: 0 / 0
Не пойму, каков контракт у ReentrantReadWriteLock?
    #38016563
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Чтобы захватить write-lock нужно будет дождаться того, чтобы поток, который сейчас захватил read-lock, его освободит.
И не важно сколько у вас читателей т.к. когда есть запросы на запись, то читатели ждут их завершения.
...
Рейтинг: 0 / 0
Не пойму, каков контракт у ReentrantReadWriteLock?
    #38016614
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimsМеня интересует, как ждут писатели. Допустим, писатель один, а читателей 100. Если писатель ждёт, то он может ждать очень долго!
У читателей нет никаких приоритетов над писателями. Но проблема "голодания", конечно же никуда не девается. Она по возможностями решается средсвами ОС и JVM, точно так же как и в обычных локах.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Не пойму, каков контракт у ReentrantReadWriteLock?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]