Java ReentrantReadWriteLock запросы
Просто быстрый вопрос о ReadWriteLocks в Java (в частности, о реализации ReentrantReadWriteLock), так как я не нахожу документацию sun понятной.
Что произойдет, если блокировка чтения удерживается потоком, когда блокировка записи запрашивается другим? Должен ли поток блокировки записи ждать, пока все текущие блокировки чтения будут сняты? Кроме того, все новые запросы блокировки чтения блокируются, пока блокировка записи не будет предоставлена и снята?
Спасибо
2 ответа
Javadoc объясняет это:
Этот класс не навязывает читателю или читателю порядок упорядочения для доступа к блокировке. Тем не менее, он поддерживает факультативную политику справедливости. Когда построено как справедливое, потоки борются за вход, используя политику порядка поступления. Когда блокировка записи снята, либо блокирующему запись будет назначена запись с самым долгим ожиданием, либо, если читатель ожидает дольше, чем какой-либо другой блок записи, группе считывателей будет назначена блокировка чтения. При построении как несправедливый порядок входа в замок не должен быть в порядке прибытия. В любом случае, если считыватели активны и писатель входит в блокировку, никакие последующие читатели не получат блокировку чтения до тех пор, пока этот писатель не установит и не снимет блокировку записи.
Что произойдет, если блокировка чтения удерживается потоком, когда блокировка записи запрашивается другим? Должен ли поток блокировки записи ждать, пока все текущие блокировки чтения будут сняты?
Да, писателю придется подождать. Но это будет только ждать текущих блокировок чтения. Любые читатели, прибывающие позже, будут стоять в очереди после писателя.
Кроме того, все новые запросы блокировки чтения блокируются, пока блокировка записи не будет предоставлена и снята?
да
ReadWriteLock
нельзя удерживать блокировку записи одновременно с блокировками чтения. Например, запросы на блокировку записи, когда блокировка чтения удерживается, приведут к блокировке или сбою.