Не паникуйте при столкновении | Углубленный анализ интерфейса JUC Lock

интервью Java
Не паникуйте при столкновении | Углубленный анализ интерфейса JUC Lock

«Эта статья участвовала в мероприятии Haowen Convocation Order, щелкните, чтобы просмотреть:Двойные заявки на внутреннюю и внешнюю стороны, призовой фонд в 20 000 юаней ждет вас, чтобы бросить вызов!"

В предыдущих двух статьях был всесторонне проанализированsynchronizedа такжеvolatile,synchronizedАтомарность, видимость и порядок доступа к общим ресурсам обеспечиваются неявным получением и снятием блокировок. а такжеvolatileС помощью протокола MESI процессора видимость и порядок доступа к общим ресурсам обеспечиваются чтением и записью основной памяти. Наличие этих двух ключевых слов может удовлетворить большинство одновременных сценариев, но разве двух из них недостаточно? Конечно нет, начиная с этой статьи я буду шаг за шагом в легендуJUC, тогда давайте сначала разберемсяJUCнижний основной интерфейсLockБар.

1. Рождение Лока

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

заsynchronized,СравниватьvolatileНемного тяжелее, но предлагает больше функциональности, но имеет недостатки.

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

Отвечая на поставленные выше вопросы, известныйDoug LeaРазработаны компоненты, используемые в параллельных сценариях, а именно параллельные пакеты.java.util.concurrent, который включает в себя пулы потоков, очереди блокировки, таймеры, синхронизаторы, параллельные коллекции и, конечно же, основные компоненты.Lock.

Lock implementations provide more extensive locking operations than can be obtained using synchronized methods and statements.

Пара исходных кодов JavaLockВыше показано первое предложение введения, которое ясно выражаетLockСравниватьsynchronized Обеспечивает более широкий спектр операций блокировки, а значит, более мощный. Действительно, начиная с Java5,LockПоявление решенныхsynchronized Некоторые из коротких досок более гибки в использовании.

2. Краткое описание замка

LockИнтерфейс, который определяет абстрактные методы, такие как снятие блокировок и получение блокировок. Как показано ниже.

Lock接口.png

Термин «интерфейс» означает, что это набор стандартных спецификаций, основанных наLockРеализуйте множество типов замков, как показано на следующем рисунке.

Lock_UML_类图.png

2.1 ReentrantLock

использоватьAQSРеализована повторная блокировка, принадлежащая мьютексу. Из диаграммы классов UML ясно видно, что это единственный класс, который реализует интерфейс блокировки. Так называемый повторный вход означает, что после того, как поток получает блокировку, ему не нужно блокироваться, чтобы снова получить блокировку, а напрямую добавляется 1 к счетчику блокировок. Он поддерживает прерывание блокировки, а конкретная реализация включает справедливую и нечестную блокировку.

2.2 ReentrantReadWriteLock

Реентерабельная блокировка чтения-записи, которая хорошо видна на диаграмме классов UML, реализует

Интерфейс ReadWriteLock, этот интерфейс предоставляет два абстрактных метода, один — ReadLock, другой — WriteLock, как показано на рисунке ниже, возврат обоих методов — интерфейс блокировки.

RLock.png

Разделение сценария блокировки на блокировку чтения-записи подходит для сценария большего количества чтения и меньшего количества записи и имеет следующие принципы:

  • чтение и чтение не исключают друг друга
  • мьютекс чтения-записи
  • мьютекс записи-записи

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

2.3 StampLock

Этот замок очень особенный и представляет собой новый механизм блокировки, представленный JDK8. Это улучшение блокировки чтения-записи.ReentrantReadWriteLockВ сценарии чтения-записи, если имеется слишком много потоков чтения, поток записи может не иметь возможности получить блокировку в течение длительного времени и находиться в состоянии голодания.StampLockРеализация основана на стратегии повторных попыток в бесконечном цикле, аналогичной операции CAS.CLHБлокировка, которая представляет собой циклическую блокировку, гарантирует отсутствие голодания и надлежащее обслуживание FIFO.


Брат, не паникуй! Не стесняйтесь оставлять лайки, обсуждать и комментировать. Добро пожаловать в колонку интервьюНе паникуйте, когда сталкиваетесь | Параллельное программирование на Java, Не беспокойтесь о повышении зарплаты во время собеседования. Также добро пожаловать, чтобы следовать за мной, я должен быть лучшим человеком.