Сразу после предыдущегоЗдравствуйте, расскажите о своем понимании Synchronized? (три), эта статья, чтобы поговорить о реализации
synchronized
Легкий замок для модернизации замка.
4.2 Легкий замок
В предыдущем разделе упоминалось, что два потока конкурируют за блокировки, что приводит к отзыву предвзятых блокировок.В процессе отзыва происходит обычное расширение блокировки, то есть обновление до облегченных блокировок. Облегченные блокировки подходят для сценариев, в которых два потока конкурируют за ресурсы блокировки, а синхронизированные блоки кода выполняются быстро. что в объектеMarkword
Что изменилось в схеме хранения?
4.2.1 Облегченный процесс обновления
Как мы все знаем, вJVM
, стек является частным для потока. Первый шаг в обновлении до легковесного замка — сделать что-то в кадре стека.
- Кадр стека вновь созданной записи блокировки
LockRecord
, запись включаетdisplaced hdr
а такжеowner
. - заблокирует объект в заголовке
Markword
Содержимое копируется в только что созданный кадр стека.LockRecord
. - записать замок
LockRecord
где владелец указывает на объект блокировки. - Наконец, заголовок объекта
Markword
Указатель на запись блокировки в стеке указывает на запись блокировкиLockRecord
(Этот шаг являетсяMarkword
сохранить реальное изменение содержания).
Процесс изменения показан на рисунке ниже.
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
Контент изменился, и ему точно не удастся установить значение.В это время поток снимет блокировку, освободит монитор (монитор) и разбудит ожидающий поток. Затем пробуждается другой заблокированный поток, чтобы повторно конкурировать за ресурс блокировки.
В следующей главе речь пойдет о тяжелых замках.
Длина длинная, чтобы продолжить чтение, пожалуйста, нажмитеЗдравствуйте, расскажите о своем понимании Synchronized? (пять)
Брат, не паникуй! Не стесняйтесь оставлять лайки, обсуждать и комментировать. Добро пожаловать в колонку интервьюНе паникуйте, когда сталкиваетесь | Параллельное программирование на Java, Не беспокойтесь о повышении зарплаты во время собеседования. Также добро пожаловать, чтобы следовать за мной, я должен быть лучшим человеком.