ReentrantReadWriteLock, в чем разница между ReadLock и WriteLock
Что я знаю, так это то, что запись аналогична синхронизированной.
Readlock и writelock как-то влияют друг на друга.
ReadLock не может работать в одиночку.
4 ответа
readLock.lock();
Это означает, что если какой-либо другой поток пишет (то есть удерживает блокировку записи), остановитесь здесь, пока другой поток не пишет.
Как только блокировка будет предоставлена, никакому другому потоку не будет разрешено писать (т.е. снимать блокировку записи), пока блокировка не будет снята.
writeLock.lock ();
Это означает, что если какой-либо другой поток читает или пишет, остановитесь здесь и подождите, пока ни один другой поток не читает или пишет.
Как только блокировка предоставлена, никакому другому потоку не будет позволено читать или записывать (то есть брать блокировку чтения или записи), пока блокировка не будет снята.
Комбинируя их, вы можете организовать только один поток за раз, чтобы иметь доступ для записи, но столько читателей, сколько вам нужно, могут читать одновременно, кроме случаев, когда поток пишет.
Перефразируй. Каждый раз, когда вы хотите прочитать из структуры, возьмите блокировку чтения. Каждый раз, когда вы хотите написать, возьмите блокировку записи. Таким образом, когда происходит запись, никто не читает (вы можете представить, что у вас есть эксклюзивный доступ), но может быть много читателей, читающих одновременно, если никто не пишет.
Документация для ReadWriteLock
проясняет это:
ReadWriteLock поддерживает пару связанных блокировок, одну для операций только для чтения и одну для записи. Блокировка чтения может удерживаться одновременно несколькими потоками считывателя, если нет писателей. Блокировка записи является эксклюзивной.
Таким образом, у вас может быть много читателей одновременно, но только один писатель - и писатель также запретит читателям читать. Это полезно, если у вас есть какой-то ресурс, который безопасно читать из нескольких потоков, и в котором чтение встречается гораздо чаще, чем запись, но когда ресурс фактически не предназначен только для чтения. (Если писателей нет и чтение безопасно, блокировка вообще не нужна).
Когда поток приобретает WriteLock
никакая другая нить не может получить ReadLock
ни WriteLock
того же экземпляра ReentrantReadWriteLock
, если этот поток не снимает блокировку. Тем не менее, несколько потоков могут получить ReadLock
в то же время.
Используя ReadWriteLock, вы можете повысить производительность приложения, в котором выполняется больше операций чтения для общего объекта, чем операций записи.
ReadWriteLock поддерживает две блокировки для операций чтения и записи. Только одна блокировка чтения или записи может быть получена одновременно. Но несколько потоков могут одновременно получить блокировку чтения, если блокировка записи не получена ни одним потоком.
ReentrantReadWriteLock является реализацией ReadWriteLock. Это дает блокировку записи самому длинному ожидающему потоку, если несколько потоков не ожидают блокировки чтения. Если несколько потоков ожидают блокировки чтения, им предоставляется блокировка чтения.
Считыватель, получивший блокировку чтения, может повторно установить блокировку чтения, аналогично, блок записи может повторно установить блокировку записи и также может получить блокировку чтения.
Смотрите http://www.zoftino.com/java-concurrency-lock-and-condition-examples
Рассмотрим ситуацию: В случае, когда структуры данных read-mostly
- они изменчивы и иногда модифицируются, но большинство обращений связаны в основном с чтением, поэтому в этом случае мы можем ослабить механизм блокировки, чтобы позволить нескольким читателям получать доступ к структурам данных вместо того, чтобы читатели ожидали, пока один читатель освободит блокировку. Пока каждому потоку гарантируется актуальное представление общих данных и ни один поток не изменяет его, пока читатели просматривают его, проблем не будет. Это то, что позволяет чтение и запись: к ресурсу могут обращаться одновременно несколько читателей или один писатель, но не оба одновременно.