|
|
|
Не пойму, каков контракт у ReentrantReadWriteLock?
|
|||
|---|---|---|---|
|
#18+
Не пойму, какова идеология работы класса ReentrantReadWriteLock? У него есть два лока, для чтения и для записи. Кто может захватить лок и в каких случаях? Например, если какой-то поток держит лок чтения, то может ли другой поток захватить лок записи? Если "нет", тогда получается, что никакого преимущества два лока не дают, потому что записывающий поток всё равно ждёт, пока читающих освободит ресурс. То же самое было бы и с одним общим локом. А если "да", тогда получается, что читающий поток может выполнять чтение параллельно с тем, как записывающий поток выполняет запись. И почему это не приводит к гонке данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2012, 01:00:47 |
|
||
|
Не пойму, каков контракт у ReentrantReadWriteLock?
|
|||
|---|---|---|---|
|
#18+
DimsНе пойму, какова идеология работы класса ReentrantReadWriteLock? У него есть два лока, для чтения и для записи. Кто может захватить лок и в каких случаях? Например, если какой-то поток держит лок чтения, то может ли другой поток захватить лок записи? Если другой поток держит лок чтения, то мы ждем, пока эта операция завершится, а т.к. внутри при этом обновляется счетчик запросов на запись. то после выхода из чтения лок будет захвачен записыващим потоком, а читатели будут ждать. Но ввиду того, что RW предназначен для сценария, когда записывающих потоков мало, то ожиданием завершения операция чтения можно пренебречь. DimsЕсли "нет", тогда получается, что никакого преимущества два лока не дают, потому что записывающий поток всё равно ждёт, пока читающих освободит ресурс. То же самое было бы и с одним общим локом. RW лок ничем не лучше "толстого" лока в ситуациях, когда число записывающих тредов велико, но он для таких ситуаций не предназначен. DimsА если "да", тогда получается, что читающий поток может выполнять чтение параллельно с тем, как записывающий поток выполняет запись. И почему это не приводит к гонке данных? Читающий поток не может вообще никак читать параллельно записывающему т.к. это нарушает контракт RW лока в котором сказано, что читатели ждут писателей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2012, 11:47:45 |
|
||
|
Не пойму, каков контракт у ReentrantReadWriteLock?
|
|||
|---|---|---|---|
|
#18+
schwaЧитающий поток не может вообще никак читать параллельно записывающему т.к. это нарушает контракт RW лока в котором сказано, что читатели ждут писателей. Меня интересует, как ждут писатели. Допустим, писатель один, а читателей 100. Если писатель ждёт, то он может ждать очень долго! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 00:24:42 |
|
||
|
Не пойму, каков контракт у ReentrantReadWriteLock?
|
|||
|---|---|---|---|
|
#18+
Нет. Чтобы захватить write-lock нужно будет дождаться того, чтобы поток, который сейчас захватил read-lock, его освободит. И не важно сколько у вас читателей т.к. когда есть запросы на запись, то читатели ждут их завершения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 10:11:11 |
|
||
|
Не пойму, каков контракт у ReentrantReadWriteLock?
|
|||
|---|---|---|---|
|
#18+
DimsМеня интересует, как ждут писатели. Допустим, писатель один, а читателей 100. Если писатель ждёт, то он может ждать очень долго! У читателей нет никаких приоритетов над писателями. Но проблема "голодания", конечно же никуда не девается. Она по возможностями решается средсвами ОС и JVM, точно так же как и в обычных локах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2012, 10:50:37 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38015360&tid=2130687]: |
0ms |
get settings: |
15ms |
get forum list: |
29ms |
check forum access: |
7ms |
check topic access: |
8ms |
track hit: |
62ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
82ms |
get tp. blocked users: |
3ms |
| others: | 322ms |
| total: | 547ms |

| 0 / 0 |
