Сразу после предыдущегоЗдравствуйте, расскажите о своем понимании Synchronized? (Четыре), эта статья, чтобы поговорить о реализации
synchronized
Легкий замок для модернизации замка.
4.3 Тяжелый замок
В предыдущем разделе упоминалось, что два потока конкурируют за ресурсы блокировки. Поток, который не получил ресурс блокировки, не получает ресурс блокировки в рамках политики спина, и облегченная блокировка будет обновлена до тяжелой блокировки. реальная блокировка., это мьютекс, блокирующие и разблокирующие ресурсы очень ресурсоемкие. Так где же этот замок и как он выглядит?
4.3.1 Где находится замок
Когда блокировка обновляется до тяжеловесной блокировки, наиболее очевидным изменением является объект блокировки.Markword
Токен блокировки становится10, указанное содержимое становится указателем на объект монитораMonitor. Как этот объект монитора реализует блокировку мьютекса? Давайте напишем кусок кода, чтобы проверить это.
public class SyncExample {
private static int i = 1;
public synchronized static void increase1() {
i++;
}
public static void main(String[] args) {
synchronized (SyncExample.class){
}
SyncExample.increase1();
}
}
Мы сначалаjava
файл, скомпилированный вSyncExample.class
, то черезjavap -v SyncExample.class
Инструкция декомпилирует указанныйJava
файл с байт-кодом.
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=1
0: ldc #3 // class me/stone/training/platform/training/java/thread/SyncExample
2: dup
3: astore_1
4: monitorenter
5: aload_1
6: monitorexit
7: goto 15
10: astore_2
11: aload_1
12: monitorexit
13: aload_2
14: athrow
15: invokestatic #4 // Method increase1:()V
18: return
Мы можем ясно видеть, что в блоке синхронизированного кода больше байт-кода.monitorenter
иmonitorexit
, эти две инструкции очень важны.
-
monitorenter
Представляет для получения объекта монитораmonitor
, после успешного получения другие конкурирующие потоки могут войти только в очередь ожидания и находятся в состоянии блокировки. -
monitorexit
Представляет объект монитора выпускаmonitor
права собственности, чтобы другие заблокированные потоки могли попытаться получить объект монитора.
4.3.2 Объекты мониторинга
synchronized
Модифицированный блок синхронизации, когда несколько потоков конкурируют за ресурсы, конкуренция фактически является объектом блокировки, и этот объект блокировки являетсяObject
Объект, который содержит объект в памяти, заголовок объекта имеет указатель наMarkword
, когда замок модернизируется до усиленного замка,Markword
будет указывать наMonitor
объект, этот объект на самом деле родной, вJVM Hotspot
, этот объект по существу являетсяC++
объект, представляет собойObjectMonitor
экземпляр класса.
Как показано на фиг.Monitor
Есть четыре важных свойства.
-
_count
,прилавок. Используется для подсчета количества попыток блокировки, мы часто говоримsynchronized
это реентерабельная блокировка, которая является ключом к реализации. -
_owner
, запишите нить текущего держателя замка, то есть того, кто в данный момент держит замок. -
_waitSet
, очередь ожидания, как следует из названия, когда поток вызывает метод ожидания объекта, поток освобождает ресурсы и входит в очередь, чтобы дождаться пробуждения. -
_EntrySet
, очередь входа, в этой очереди ставятся в очередь потоки, которые не могут конкурировать за блокировки, и эти потоки находятся в состоянии блокировки.
Нить приобрела замок в соревновании тяжеловесных замков, в это время_owner
указывает на текущий поток,_count
Счетчик увеличивается на 1, блокировка не получена потоком вentry
Очередь в очереди. Если поток, получивший ресурс блокировки, снова входит в блок синхронизации, управляемый тем же ресурсом блокировки, поскольку суждение_owner
указывая на себя, поэтому_count
Добавьте 1, чтобы реализовать блокировку с повторным входом. Наконец, выйдите из синхронизированных блоков по очереди, постепенно уменьшите счетчик на 1 и, наконец, уменьшите его до 0, выйдите из всех синхронизированных блоков, освободите ресурсы блокировки и уведомитеentry
Очередь может упорядочивать потоки в очереди, чтобы они конкурировали за ресурсы блокировки.
wait
Очередь очень особенная, поток выполняется в процессе удержания блокировки#wait
метод, поток освободит объект блокировки и войдет в эту очередь. все жду#notify
Метод просыпается, а затем входит в очередь ожидания, чтобы конкурировать с другими потоками за ресурсы блокировки.
должны знать о том,#notifyМетод заключается в том, чтобы взять случайный
wait
Потоки в очереди помещаются вentry
очередь,#notifyAll
заключается в том, чтобы поместить все ожидающие потоки вentry
очередь .
4.3.3 Нечестная блокировка
synchronized
Тяжеловесная блокировка не является справедливой блокировкой, то есть когда поток, удерживающий ресурс, освобождает ресурс блокировки, он помещается вentry
Потоки очереди будут синхронизироваться и конкурировать за ресурсы блокировки, и не позволят потоку с наибольшим временем ожидания напрямую получить блокировку, и даже возможно, что, когда новый поток внезапно попытается получить блокировку, поток, удерживающий ресурс блокировки просто освобождает блокировку.Поток получит ресурс блокировки. Недостатком несправедливых блокировок является то, что некоторые потоки могут не иметь возможности получить ресурсы блокировки в течение длительного времени и находятся в состоянии голодания.Если вы хотите использовать справедливые блокировки, вы можете использоватьReentrantLock
честный режим блокировки.
Длина длинная, чтобы продолжить чтение, пожалуйста, нажмитеЗдравствуйте, расскажите о своем понимании Synchronized? (шесть)
Брат, не паникуй! Не стесняйтесь оставлять лайки, обсуждать и комментировать. Добро пожаловать в колонку интервьюНе паникуйте, когда сталкиваетесь | Параллельное программирование на Java, Не беспокойтесь о повышении зарплаты во время собеседования. Также добро пожаловать, чтобы следовать за мной, я должен быть лучшим человеком.