Не паникуйте при встрече | Здравствуйте, расскажите о своем понимании Synchronized? (Четыре)

Java опрос
Не паникуйте при встрече | Здравствуйте, расскажите о своем понимании Synchronized? (Четыре)

Сразу после предыдущегоЗдравствуйте, расскажите о своем понимании Synchronized? (три), эта статья, чтобы поговорить о реализацииsynchronizedЛегкий замок для модернизации замка.

4.2 Легкий замок

В предыдущем разделе упоминалось, что два потока конкурируют за блокировки, что приводит к отзыву предвзятых блокировок.В процессе отзыва происходит обычное расширение блокировки, то есть обновление до облегченных блокировок. Облегченные блокировки подходят для сценариев, в которых два потока конкурируют за ресурсы блокировки, а синхронизированные блоки кода выполняются быстро. что в объектеMarkwordЧто изменилось в схеме хранения?

4.2.1 Облегченный процесс обновления

Как мы все знаем, вJVM, стек является частным для потока. Первый шаг в обновлении до легковесного замка — сделать что-то в кадре стека.

  1. Кадр стека вновь созданной записи блокировкиLockRecord, запись включаетdisplaced hdrа такжеowner.
  2. заблокирует объект в заголовкеMarkwordСодержимое копируется в только что созданный кадр стека.LockRecord.
  3. записать замокLockRecordгде владелец указывает на объект блокировки.
  4. Наконец, заголовок объектаMarkwordУказатель на запись блокировки в стеке указывает на запись блокировкиLockRecord(Этот шаг являетсяMarkwordсохранить реальное изменение содержания).

Процесс изменения показан на рисунке ниже.

未命名文件.png

4.2.2 Облегченный соревновательный процесс

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

Так почему же поток, не завладевший ресурсом блокировки, ожидает циклически, а не блокируется?Наиболее важной причиной этого является необходимость блокировки и пробуждения потока.CPUОт пользовательского режима до режима ядра частые блокировки и пробуждения являются тяжелым бременем для ЦП, что неизбежно оказывает большое влияние на одновременную производительность операционной системы. Так что возьмите петлю, чтобы подождать, этоблокировка спина, в этом случаеAQSТакже используется нижний слой замка.

Так как же поток, который не получил ресурс блокировки, ожидает циклически?Постоянный цикл потребляетCPUПроизводительность, конечно же, у данной спиновой блокировки есть условие остановки, которое делится на два случая.

  • существуетJava 1.6Ранее было установлено количество вращений, и цикл будет прекращен, если количество циклов будет превышено.Как правило, количество раз установлено 10, что можно установить, установивHotSpot 参数 -XX:PreBlockSpinЧтобы изменить, перед изменением этого параметра вам необходимо сначала установить параметр-XX:+UseSpiningВключите блокировку вращения.
  • существуетJava 1.6Позже, по сравнению с интеллектуальной адаптивной блокировкой вращения, этот метод определяет время самовыбора блокировки в соответствии с предыдущим временем и состоянием самовыбора той же блокировки, а не фиксированным количеством вращений.
4.2.3 Снятие блокировки Spinlock

Когда поток, который не получил ресурс блокировки, не может получить блокировку путем вращения, блокировка будет обновлена ​​до тяжеловесной блокировки, а заголовок объекта блокировки будет изменен.MarkwordЗначение в измененном содержимом примерно соответствует указателю на тяжеловесную блокировку, а флаг модифицированной блокировки равен 10. В этот момент поток блокируется.

Когда синхронизированный блок кода, которому принадлежит блокировка, выходит, он передается черезCASхранить записи в стекеMarkwordсодержимое и текущий объект блокировкиMarkwordсравнить затем установить, потому что текущийMarkwordКонтент изменился, и ему точно не удастся установить значение.В это время поток снимет блокировку, освободит монитор (монитор) и разбудит ожидающий поток. Затем пробуждается другой заблокированный поток, чтобы повторно конкурировать за ресурс блокировки.

偏向锁升级流程图 (1).pngВ следующей главе речь пойдет о тяжелых замках.

Длина длинная, чтобы продолжить чтение, пожалуйста, нажмитеЗдравствуйте, расскажите о своем понимании Synchronized? (пять)


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