Интервьюер: Скажите, в чем разница между честными и нечестными замками?

интервью Java
Интервьюер: Скажите, в чем разница между честными и нечестными замками?

Ставьте лайк и смотрите снова, формируйте привычку, ищите в WeChat【Третий принц Ао Бин] Обратите внимание на этот инструмент человека, который борется за выживание в Интернете.

эта статьяGitHub github.com/JavaFamilyВключено, и есть полные тестовые площадки, материалы и мой цикл статей для интервью с производителями первой линии.

предисловие

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

текст

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

Справедливая блокировка: несколько потоков получают блокировки в том порядке, в котором они применяются для блокировки.Потоки будут напрямую входить в очередь за очередью, и первое место в очереди всегда может получить блокировку.

  • Преимущества: все потоки могут получать ресурсы и не будут простаивать в очереди.
  • Недостатки: пропускная способность сильно упадет, за исключением первого потока в очереди, другие потоки будут заблокированы, а накладные расходы ЦП на пробуждение заблокированного потока будут очень большими.

Несправедливая блокировка: когда несколько потоков получают блокировку, они пытаются получить ее напрямую. Если они не могут получить ее, они попадают в очередь ожидания. Если они могут получить ее, они получают блокировку напрямую.

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

Я привел пример, чтобы объяснить его семье в простой для понимания форме.После нескольких дней раздумий я, наконец, понял, как привести пример, когда позавчера пошел в KFC с Санвеем, чтобы купить завтрак.

Время завтрака.Ао Бин хотел пойти в KFC на завтрак, но обнаружил, что там очень много людей. Как только он не подумал об этом, он послушно встал в очередь в конце очереди, так что все чувствовали себя это было справедливо, первый пришел первый обслужен, так что это честный замок Немного.

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

Но иногда яйцо поднимается и говорит мне откатиться назад в очереди.Я также запугиваю мягкое и боюсь жесткого.

Приведя простой пример, вы можете сказать: «Шлак С, я тоже это знаю».

Стоит ли вернуться к реальной реализации?На самом деле в ReentrantLock есть родственные честные и нечестные блокировки, которыми все часто пользуются.

Вы все еще помните класс Sync, о котором я упоминал в главах об оптимистичных и пессимистичных блокировках, который является внутренним классом самого ReentrantLock. Он наследует AbstractQueuedSynchronizer. Большинство операций, которые мы выполняем над блокировками, реализуются самим Sync.

Синхронизация имеет два подкласса: FairSync и NofairSync.

Названия их подклассов можно увидеть и понять Как справедливость и несправедливость отражаются на уровне кода?

Честный замок:

Вы можете видеть, что он добавил суждение hasQueuedPredecessors, так о чем он судит?

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

Я всегда чувствую, что писать это должно быть почти то же самое, но после того, как я села и спокойно подумала, я обнаружила, что все еще чего-то не хватает.

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

Справедливая блокировка справедлива или несправедлива? Давайте проследуем за Bing Bing во внутренний мир ReentrantLock.

Так много было упомянуто выше, я думаю, у вас должно быть некоторое понимание, как это несправедливо, что заходит нить, подонок ReentrantLock? (по умолчанию несправедливая блокировка)

Позвольте мне сначала нарисовать картинку, чтобы помочь вам понять детали:

Sync ReentrantLock наследует AbstractQueuedSynchronizer, также известный как AQS.

Он также является ядром блокировки и снятия блокировок ReentrantLock.Об общем содержании я упоминал в предыдущем выпуске, поэтому не буду вдаваться в подробности.Давайте посмотрим на процесс блокировки.

Поток A готов войти в систему, чтобы получить блокировку. Сначала он оценивает состояние состояния и обнаруживает, что оно равно 0, поэтому он может преуспеть в CAS, и модифицирует поток, в настоящее время удерживающий блокировку для себя.

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

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

В это время подошел мальчик С в зеленой шапке и выяснил, почему состояние было 0. Он решительно поменял CAS на 1, а также поменял на себя нить, которая сейчас держит блокировку.

Поток B был разбужен A для получения блокировки, и обнаружил, что состояние на самом деле 1, а CAS не прошел.Он мог только вернуться в очередь и ждать в очереди.Маршрут не забыл поругать A как отморозка , как обмануть себя и обмануть свои чувства.

Выше показан поток с несправедливой блокировкой.В этом случае возможно, что поток, подобный B, не может получить ресурсы в течение длительного времени.Преимущество состоит в том, что некоторые потоки могут сократить время ожидания и улучшить коэффициент использования.

Теперь это несправедливо по умолчанию.Если вы хотите быть справедливым, вы должны передать значение true в конструктор.

ReentrantLock lock = new ReentrantLock(true);

После разговора о несправедливости позвольте мне также поговорить о справедливом процессе:

Строка A хочет получить блокировку сейчас, поэтому она сначала оценивает состояние и обнаруживает, что оно также равно 0. После просмотра очереди выясняется, что она первая, и решительно меняет удерживающий поток на себя.

Тема б пришла судить о состоянии, а? На самом деле это состояние = 1, тогда cas дает сбой, поэтому я могу только послушно стоять в очереди.

未命名文件 (https://tva1.sinaimg.cn/large/00831rSTly1gcxaojuen2j30oa0jxgmh.jpg)
Файл без названия (https://tva1.sinaimg.cn/large/00831rSTly1gcxaojuen2j30oa0jxgmh.jpg)

Пришел поток А теплый человек, и он был отпущен вскоре после его удержания.После изменения всех состояний он пошел пробуждать поток В.В это время пришел поток С, но он сначала оценил состояние и обнаружил, что это 0 , подумав, что там драма, а потом я пошел посмотреть очередь и обнаружил, что впереди кто-то стоит.Как добропорядочный гражданин новой эпохи, я решил стать в очередь.

Поток B получает вызов от A, чтобы оценить состояние, и обнаруживает, что значение равно 0, а также является первым в очереди Это вкусно, и его можно получить.

Суммировать:

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

Призрак знает, сколько я заплатил за рисование картинок, это слишком много, чтобы поставить лайк?

домашнее задание после уроков

Является ли честный замок действительно честным? Какой уровень не является абсолютной справедливостью, а какой уровень можно считать справедливым?

Я Ао Бин, мастер по инструментам, который живет в Интернете.

Лучшие отношения - это достигать друг друга, твой«Три ссылки»Это самая большая движущая сила для создания Bing Bing, увидимся в следующем выпуске!

Статья постоянно обновляется, вы можете искать в WeChat "Третий принц Ао Бин"Прочтите это в первый раз, ответьте [материал】【интервью】【резюме] Подготовленные мной материалы интервью и шаблоны резюме крупных заводов первой линии, эта статьяGitHub github.com/JavaFamilyОн был включен, и есть полные тестовые сайты для интервью с крупными заводами.Добро пожаловать в Star.