2016-05-10 5 views
3

В Java Параллелизм на практике Б. Гетц, раздел 13.5 сказал:ярмарка замок в ReeantrantReadWriteLock

В Java 5.0, блокировка чтения ведет себя больше как семафора, чем замок, поддерживая только число активных читателей, а не их личности. Поведение было изменено на Java 6, чтобы отслеживать также, какие потоки получили замок чтения6.

6 Одна из причин этого изменения является то, что под Java 5.0, реализация блокировки не может различить нить запрашивающего читать замок в первый раз и возвратный запрос блокировки, который сделал бы справедливойблокировка чтения-записи тупиковая блокировка.

Мой вопрос в том, что не так с честностью? Почему был несправедливый замок для чтения и записи, защищенный от тупика?

Не могли бы вы объяснить, что он имел в виду? Я имею в виду, в каких обстоятельствах fair блокировка чтения и записи под Java 5 вызывает тупик? И если он вел себя как Semaphore, почему не явилась ошибка Semaphore?

+3

Возможно, вам захочется остановиться и спросить, что же справедливо? В настольной или серверной среде процессы часто конкурируют друг с другом за процессорное время. «Справедливость» в планировщике гарантирует, что каждый конкурирующий процесс получает справедливую долю. Но в рамках одной программы потоки должны _cooperate_ вместо конкуренции. И, когда нужно выполнить работу, не важно, какой поток выполняет эту работу. Если в пуле есть два рабочих потока, и для них всего одна половина работы для них, это ничего не повредит, если рабочая нагрузка не будет распределена «справедливо». –

+0

@jameslarge в контексте получения прав на блокировку указывает, что потоки, конкурирующие за одну и ту же блокировку, приобретают ее в том порядке, в котором они ее запрашивали. – bowmore

+0

@bowmore, я понимаю, что «справедливость» в планировщике - это не совсем то же самое, что «справедливая» реализация мьютекса, но это не совпадение, что они имеют одно и то же имя. Оба они предназначены для обеспечения того, чтобы потоки/процессы получали «справедливый» доступ, когда они конкурируют за ресурсы. Я сомневаюсь в важности «честных» мьютексов, потому что, когда я пишу многопоточный код, я не хочу, чтобы мои потоки честно конкурировали: я хочу, чтобы они не конкурировали вообще. Это трудная цель, но ИМО стоит того, чтобы добиться успеха. –

ответ

6

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

Если есть запросы на запись из других потоков, предшествующих этому повторному запросу, они не могут продвигаться, поскольку поток, удерживающий блокировку, также заблокирован, ожидая его повторного запроса. Результат в тупике.

Несправедливая стратегия блокировки не страдает от этой проблемы, так как реентерабельный запрос может перепрыгнуть в очередь (баржи) и не нужно ждать предварительных запросов.

Семафор не страдает от этой проблемы, поскольку он не предназначен для повторного использования.

+1

Хорошее объяснение. До сих пор это не доходило. –

+0

_Semaphore не страдает от этой проблемы, потому что он не предназначен для реентерации. Ну, это не совсем понятно.Из того, что вы объясняете, я бы сказал, что они не страдают от этого, так как нет «читать»/«писать» -сайтхорфоры. –

+0

@DmitriiBundin То, что я имею в виду, это то, что одна и та же тема, запрашивающая другое разрешение от Семафора, должна получить второе разрешение, неважно, что у него уже есть. Очевидно, что тоже можно попасть в тупик, но это будет ошибка клиента, а не реализация Семафора. – bowmore

Смежные вопросы