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

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

Сразу после предыдущегоЗдравствуйте, расскажите о своем понимании 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экземпляр класса.

未命名文件.png

Как показано на фиг.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, Не беспокойтесь о повышении зарплаты во время собеседования. Также добро пожаловать, чтобы следовать за мной, я должен быть лучшим человеком.