Из ReentrantLock javadoc:
Справедливый режим
Когда они построены как справедливые, потоки претендуют на запись с использованием приблизительнопорядок прибытия. Когда текущий блокировка будет выпущена либо самая длинная очередь одиночного писателя будет назначить блокировку записи, или если есть группа потоков считывателей ожидая дольше, чем все нити ожидающего писателя, эта группа будет назначил блокировку чтения.Тема, которая пытается получить честное чтение блокировка (без повторного) блокируется, если удерживается блокировка записи или есть нить писателя ожидания. Нить не получит считывание блокировки до тех пор, пока не будет приобрел и выпустил блокировку записи. Конечно, если ожидающий писатель отказывается от своего ожидания, оставляя один или несколько потоков чтения как самый длинный официантов в очереди с блокировкой записи, тогда эти читатели будут назначить блокировку чтения.
Поток, который пытается получить справедливую блокировку записи (без повторной) будет блокироваться, если оба блокировки чтения и записи не будут свободны (что подразумевает отсутствие ожидающих потоков). (Обратите внимание, что неблокирующий ReentrantReadWriteLock.ReadLock.tryLock() и Методы ReentrantReadWriteLock.WriteLock.tryLock() не соблюдают эту справедливая настройка и приобретет замок, если это возможно, независимо от того, ожидающих потоков.)
Может быть, это проблема с моим английским, но я вижу противоречия на этом декапсии:
Начиная с первого параграфа, я не понимаю смысла приблизительно политики порядка прибытия
- из первого абзаца я понимаю, что блокировка получает самый старый ожидающий поток. Если самый старый поток - прочитанный поток, то это будет группа прочитанных потоков, которые ждут дольше, чем самый длинный поток записи ожидания.
- Из второго абзаца я понимаю, что блокировка чтения не будет получена, если существует блокировка записи в wait-set.
Просьба уточнить это противоречие.