Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Не пойму, каков контракт у ReentrantReadWriteLock? / 5 сообщений из 5, страница 1 из 1
27.10.2012, 01:00:47
    #38015360
Dims
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не пойму, каков контракт у ReentrantReadWriteLock?
Не пойму, какова идеология работы класса ReentrantReadWriteLock? У него есть два лока, для чтения и для записи. Кто может захватить лок и в каких случаях? Например, если какой-то поток держит лок чтения, то может ли другой поток захватить лок записи?

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

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

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

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


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