Java. Многопоточность. Урок 17. Synchronized, монитор, синхронизированные блоки.

แชร์
ฝัง
  • เผยแพร่เมื่อ 18 พ.ย. 2024

ความคิดเห็น • 26

  • @bro-pb6mg
    @bro-pb6mg 6 หลายเดือนก่อน +5

    Буквально лучший плейлист уроков на ютубе в ru сегменте. Думаю даже в целом в ютуб никто многопоточности в java столько внимания не уделил. Красавчик !

    • @vladzuev10
      @vladzuev10  6 หลายเดือนก่อน +1

      Огромное спасибо! Очень приятно!)

    • @nikitaparshin_nsk
      @nikitaparshin_nsk 6 หลายเดือนก่อน +1

      Поддерживаю!

  • @anjelomanoranjan
    @anjelomanoranjan ปีที่แล้ว +4

    Спасибо тебе огромное! Ты один из лучших блогеров по Java на русскоязычном ютьюбе

    • @vladzuev10
      @vladzuev10  ปีที่แล้ว +1

      Вам спасибо! Безумно приятно!)

  • @nikitaparshin_nsk
    @nikitaparshin_nsk 6 หลายเดือนก่อน +2

    Гениальные объяснения гениальных вещей.. Спасибо!

    • @vladzuev10
      @vladzuev10  6 หลายเดือนก่อน

      И Вам спасибо за такие комментарии и активность на канале!)

  • @Almiron182
    @Almiron182 8 หลายเดือนก่อน +1

    Очень круто объясняешь!

    • @vladzuev10
      @vladzuev10  8 หลายเดือนก่อน

      Большое спасибо! Очень рад!)

  • @nikitafilimonyuk1339
    @nikitafilimonyuk1339 ปีที่แล้ว +7

    Чувак, крутые уроки)🤌 Уже несколько дней тебя смотрю и переписываю код) Красавчик😎

    • @vladzuev10
      @vladzuev10  ปีที่แล้ว

      Спасибо большое!)

  • @damirdamir8388
    @damirdamir8388 ปีที่แล้ว +2

    Классно было бы также видеть как сильно многопоточность влияет на производительность.
    Я немного поисследовал и самый первый пример (где 2 синхронизированных метода обращались к одной переменной), а именно где
    * private static int INCREMENT_AMOUNT_1 = 50000000; // моё именование переменных
    * private static int INCREMENT_AMOUNT_2 = 60000000;
    *
    * Выполним программу, когда методы помечены synchronized, но они обращаются к разным переменных и где синхронизация бесполезна
    *
    * Когда методы синхронизированы - то время выполнения 3 секунды, когда не синхнонизированы - от 265 милисекунд
    *
    * Если значений в 10 раз в каждом больше, то синхронизированные выполняются за 33 сек, а не синхронизированные за 260 милисекунд
    Но возможно такими проверками видео были бы сильно перегружены, но понимания "правильно постановки synchronized" выросло бы.
    Но и так с удовольствием смотрю последовательно данный плейлист, пока всё замечательно и судя по потому как преподносится материал - дальше будет также понятно

    • @vladzuev10
      @vladzuev10  ปีที่แล้ว +1

      Большое спасибо за комментарий!) Стоит сделать отдельный ролик с такими замерами, я согласен, но не могу обещать, что это будет в скором времени)

  • @Devivl
    @Devivl ปีที่แล้ว +4

    Выдержка из книги "Философия Java" Б. Эккеля о synchronized.
    Когда следует применять синхронизацию? Используйте правило синхронизации Брайана (Брайан Гетц - соавтор книги «Java Concurrency in Practice»):
    «Если вы записываете данные в переменную, которая может быть затем прочитана другим потоком, или читаете данные из переменной, которая могла быть записана другим потоком, вы должны использовать синхронизацию. Кроме того, и читающий, и записывающий потоки должны синхронизироваться по одной блокировке».

  • @wal1989wal
    @wal1989wal ปีที่แล้ว +2

    спасибо за уроки!) Пользуйся cmd+d или ctrl+d что бы строки кода копировать, если надо поменять только название переменной

    • @vladzuev10
      @vladzuev10  ปีที่แล้ว

      Вам спасибо за комментарий и совет!)

    • @wal1989wal
      @wal1989wal ปีที่แล้ว +1

      🤝@@vladzuev10

  • @devprototype
    @devprototype 10 หลายเดือนก่อน +2

    CTRL + D - копировать строки

  • @Veligorro
    @Veligorro 9 หลายเดือนก่อน +1

    Спасибо за отличную лекцию.
    Правильно ли я понимаю, что в случае использования в качестве монитора Runner.class потоки попеременно блокируют доступ ко всей логике описанной в классе и потому выполняются последовательно?
    Когда мы вводим два Object, мы вводим уже разграничение. То есть работа c firstCouner возможна если монитор Object1 cвободен и работа с secondCounter возможна если монитор Object2 свободен. Таким образом мы сделали 4 потока, которые используют 2 монитора и могут идти параллельно по 2 синхронизируясь уже между собой.

    • @vladzuev10
      @vladzuev10  9 หลายเดือนก่อน

      И Вам за комментарий!) Да все верно, только используя монитор объекта Runner.claas мы блокируем доступ не ко всей логике класса, а к статическим синхронизированным методам. Поток, захвативший монитор объекта Runner.class, и поток, захвативший монитор обьекта new Runner(), могут работать параллельно

  • @RED75xtx
    @RED75xtx ปีที่แล้ว +1

    Большое спасибо за видео. Подскажите пожалуйста на сколько правильно использовать IntConsumer? Не очень красиво и немного запутывающе выглядит требование. Заранее прошу прощения, сам не сильно разбираюсь, но субъективно кажется, что должен быть более элегантный способ специфицировать протокол принимаемой функции. Заранее, большое спасибо!

    • @vladzuev10
      @vladzuev10  ปีที่แล้ว +1

      Здравствуйте, большое спасибо за комментарий!) Не нужно просить прощения, я всегда только рад обсудить) Более элегантный способ 100% всегда существует) Здесь можно создать класс CounterTask, который будет реализовать интерфейс Runnable. В этом классе инкапсулировать всю логику по работе с нашими значениями. И затем с помощью экземпляров класса CounterTask создавать экземпляры класса Thread

  • @НиколайЛитвинов-ф2э
    @НиколайЛитвинов-ф2э ปีที่แล้ว +1

    Очень доступно все, спасибо. Но есть вопрос, почему именно ты создаешь объект класса Object (private static final Object LOCK_TO_INCREMENT_AMOUNT_FIRST_COUNTER = new Object();) Можно ли создавать объекты текущего класса (private static final Runner LOCK_TO_INCREMENT_AMOUNT_FIRST_COUNTER = new Runner();)? По идее да, если у каждого объекта свой монитор, и работать будет так же. Или как лучше или правильнее? (Это вопрос про статические методы)

    • @vladzuev10
      @vladzuev10  ปีที่แล้ว +1

      Большое спасибо за активность!) Да, все верно, можно создавать и экземпляры класса Runner в этом случае

  • @sergey6661313
    @sergey6661313 5 หลายเดือนก่อน +1

    я так и не понял. Как мониторы освобождают от проблеммы одновременной записи двух потоков? Да они теперь каким то чудом не пишут одновременно в одну переменную, но они ведь по прежнему могут писать/читать одновременно в *сам* монитор:
    один поток смотрит состояние монитора - он свободен.
    вдруг второй его захватывает,
    теперь первый (помня что монитор свободен, он ведь только что проверял) сам захватывает монитор,
    🤯

    • @vladzuev10
      @vladzuev10  5 หลายเดือนก่อน

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