Яка різниця між ексклюзивним замком та загальним замком?


119

Згідно з Вікіпедією,

Спільні блоки іноді називають "блоками читання", а ексклюзивні - іноді називаються "блокування запису".

Чи можете ви пояснити міркування за термінами "спільний" та "ексклюзивний"?


Чи неексклюзивний замок - це інша назва спільного блокування?
Рамеш Папаганті

Відповіді:


418

Я записав цю відповідь, тому що думав, що це буде весела (і придатна) аналогія:

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

Поки вчитель щось пише (ексклюзивний замок) на дошці:

  1. Ніхто не може її прочитати, тому що вона все ще пишеться, і вона блокує ваш погляд => Якщо об'єкт виключно заблокований, спільні блокування неможливо отримати .

  2. Інші викладачі не підходять і не почнуть писати або дошка стає нечитабельною і бентежить учнів => Якщо об'єкт виключно заблокований, інших ексклюзивних замків неможливо отримати .

Коли учні читають (ділиться замками), що знаходиться на дошці:

  1. Всі вони можуть разом прочитати, що на ньому, => Кілька спільних блокувань можуть співіснувати .

  2. Вчитель чекає, коли вони закінчать читати, перш ніж вона очистить дошку, щоб написати більше => Якщо один або декілька спільних замків вже існують, ексклюзивні блокування неможливо отримати .


2
дуже хороше пояснення. Однак PO попросив походження походження "спільних" та "ексклюзивних" номіналів, а не пояснення термінів як таких.
serhio

Це "Якщо один або декілька спільних блокування вже існують, ексклюзивні блокування неможливо отримати". правда? інтермени ReentrantReadWriteLock? Я думав, що блокувати запис можна в будь-який час, інакше голодування за записом може статися через постійне читання.
Канагавелу Сугумар

1
@KanagaveluSugumar, так, це правда. Ви просто не можете отримати блокування запису, коли інший об'єкт вже містить блокування читання на тому ж об’єкті. У цьому вся суть блокування читання-запису. Якщо у вас трапляється щось перезаписати, поки хтось читає це, що б вони читали? Я не знаю, чому ви вирішили вибрати замок для читання-запису "повторного учасника", але повторна антураж означає, що власник блокування повторного вступу може "заблокувати ()" його знову та всі наступні lock()дзвінки після перший повернеться негайно та успішно. тобто ви можете успішно заблокувати щось, що вже маєте.
АрджунШанкар

2
Ви також згадуєте, що "я думав, що блокування запису можна отримати в будь-який час, інакше голодування за записом може статися через постійне читання" - цього просто не може бути. Блокування запису неможливо отримати, поки інша сутність вже містить блокування читання / запису. Що може статися, це те, що якщо кілька об'єктів вже чекають, щоб заблокувати об'єкт, тоді чекання writerнадається перевагу, ніж читачі, які чекають, коли блокування вибере, хто отримає замок наступного (коли його розблокує його поточний власник). Йдеться про політику .
ArjunShankar

Дякую! Я вибрав ReentrantReadWriteLock; оскільки це клас реалізації для ReadWriteLock в Java. Тоді чи є якийсь піднятий прапор чи встановлено більше пріоритету, щоб сказати подальші нові нитки для читання, щоб чекати, коли нитка запису розпочнеться в очікуванні? Бо як уникнути голодування потоку запису через постійний запит на читання?
Канагавелу Сугумар

34

Це досить просто. Блокування читання також відоме як спільні блокування, оскільки одночасно може читати більше одного процесу. Суть блокування читання полягає у запобіганні придбання блокування запису іншим процесом. Навпаки, блокування запису гальмує всі інші операції, поки операція запису завершена, тому її описують як ексклюзивну.

Таким чином, блокування читання говорить "ви можете читати зараз, але якщо ви хочете написати, вам доведеться почекати", тоді як блокування запису говорить "вам доведеться почекати".


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

Некомпетентне використання блокування є головною причиною головних болів. Використання системи блокування, яка відрізняє блокування читання та запису - це гарний початок, але ретельна конструкція іноді може усунути значну частину потреби блокування. Наприклад, стан сеансу ніколи не повинен зберігатися в одній глобальній колекції за кожним елементом стану.

Я фактично бачив це зроблено. Це жорстокий дизайн, що спричиняє бокс та зміну колекції за кожну останню зміну стану сеансу, що тягне за собою тривалий блокування запису. Накладні витрати були калічними, що фактично зводило сервер до однопоточної поведінки.

Просто об'єднання всього стану сеансу в структуру було величезним покращенням. Зміни стану сесії просто змінили значення членів структури сесії. Оскільки жоден інший сеанс не мав приводу і навіть можливості безпосередньо посилатися на стан сеансу, єдиний збірник, який оновлювався, був списком сеансів. Як результат, блокування було абсолютно непотрібним під час сесії, лише на початку та в кінці, а пропускна здатність зросла на фактор 3000.

Інший поширений сценарій блокування - це ресурси, що поділяються між потоками користувацької програми. Більшість сучасних фреймворків вирішують це за допомогою повідомлень, а не блокування; при "переході до потоку користувальницького інтерфейсу" ви фактично ставите в чергу чергове повідомлення, що містить покажчик функції та деякі параметри (або делегат та кадр стека залежно від реалізації).


6
  • Ексклюзивний або блокування запису надає процесу ексклюзивний доступ для запису до зазначеної частини файлу. Поки відбувається блокування запису, жоден інший процес не може заблокувати цю частину файлу.

  • Блокування спільного доступу чи читання забороняє будь-якому іншому процесу вимагати блокування запису у зазначеній частині файлу. Однак інші процеси можуть вимагати блокування читання.

Більше про це: http://www.gnu.org/software/libc/manual/html_node/File-Locks.html


2

Принцип ж на базі даних. Відповідно до документації Oracle

Режим ексклюзивного блокування запобігає спільному доступу до пов'язаного ресурсу. Цей режим блокування отримується для зміни даних. Перша транзакція виключно для блокування ресурсу - це єдина транзакція, яка може змінювати ресурс до виходу ексклюзивного блокування.

Режим блокування спільного доступу дозволяє поділитися пов'язаним ресурсом залежно від операцій, що займаються. Кілька користувачів, які читають дані, можуть обмінюватися даними, тримаючи блокування доступу, щоб запобігти одночасному доступу письменника (якому потрібен ексклюзивний замок). Кілька транзакцій можуть
придбати блокування акцій на одному ресурсі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.