Подтвердить что ты не робот

ReentrantReadWriteLock: в чем разница между ReadLock и WriteLock?

Что я знаю, это:

  • ReadLock и WriteLock влияют друг на друга
  • WriteLock как синхронизированный
  • ReadLock не может работать в одиночку
4b9b3361

Ответ 1

readLock.lock();

  • Это означает, что если какой-либо другой поток пишет (то есть удерживает блокировку записи), остановитесь здесь, пока другой поток не пишет.
  • Как только блокировка предоставлена, никакому другому потоку не будет разрешено писать (то есть снимать блокировку записи), пока блокировка не будет снята.

writeLock.lock();

  • Это означает, что если какой-либо другой поток читает или пишет, остановитесь здесь и подождите, пока никакой другой поток не читает или пишет.
  • Как только блокировка предоставлена, никакому другому потоку не будет позволено читать или писать (то есть брать блокировку чтения или записи), пока блокировка не будет снята.

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

Перефразируй. Каждый раз, когда вы хотите прочитать из структуры, возьмите блокировку чтения. Каждый раз, когда вы хотите написать, возьмите блокировку записи. Таким образом, когда происходит запись, никто не читает (вы можете представить, что у вас есть эксклюзивный доступ), но может быть много читателей, читающих одновременно, если никто не пишет.

Ответ 2

Документация для ReadWriteLock делает это ясно:

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

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

Ответ 3

Когда поток получает WriteLock, ни один другой поток не может получить ReadLock и WriteLock того же экземпляра ReentrantReadWriteLock, если только этот поток не освободит блокировку. Тем не менее, несколько потоков могут одновременно получать ReadLock.

Ответ 4

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

ReadWriteLock поддерживает две блокировки для операций чтения и записи. Только одна блокировка чтения или записи может быть получена одновременно. Но несколько потоков могут одновременно получить блокировку чтения, если блокировка записи не получена ни одним потоком.

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

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

Смотрите http://www.zoftino.com/java-concurrency-lock-and-condition-examples