Многопоточность в Java: основы

Sdílet
Vložit
  • čas přidán 23. 04. 2015
  • Общие сведения о параллелизме. Запуск и остановка потоков. Синхронизация потоков: synchronized, wait, notify. Модель памяти. Ключевое слово volatile.
    Лекция №10 в курсе "Java" (осень 2014).
    Преподаватель: Алексей Владыкин.
    Страница лекции на сайте CS центра (с презентацией): goo.gl/FMDaEg

Komentáře • 70

  • @user-xl5ri7ut4t
    @user-xl5ri7ut4t Před 2 lety +73

    Тайминг (лайк чтоб поднять наверх)
    05:10 Закон Амдала
    10:00 Виды параллелизма в Java
    12:24 Проблемы параллельных программ
    15:35 Основные методы Thread
    18:45 Как диагностировать проблему? (Thread dump)
    20:59 Создание потока ( имплементация Runnable || расширение Thread)
    22:28 Жизненный цикл потока
    30:17 Прерывание потока
    40:30 Возможности встроенной синхронизации
    52:30 Ожидание и уведомления { wait() ; notify() ; notifyAll() }
    01:09:16 Про Атомарность
    01:11:49 Про Видимость
    01:13:35 happens before

  • @drochit5901
    @drochit5901 Před 2 lety +6

    смотреть в 2021 году, не знаю, насколько это актуально, но в целом, все что мне надо было я тут смог подробно разьяснить)

  • @asriyanarseniy8356
    @asriyanarseniy8356 Před 2 lety +6

    Алексей Владыкин, спасибо Вам большое! Не встречал еще более компетентного преподавателя по джаве. Поставленная речь и глубокие знания, никаких слов паразитов и обсасывания, только четко и по делу

  • @TTTuTTT
    @TTTuTTT Před 6 lety +11

    У человека преподавательский талант - умение объяснять логично, без лишних слов, простым, понятным, но достаточно научным языком. Действительно отлично.
    Капля критики - не объяснил, хотя использовал volatile(я имею ввиду в контексте кэша потоков) и join.

  • @konstantinchvilyov9602
    @konstantinchvilyov9602 Před 7 lety +22

    Спасибо, Алексей. Мне очень нравятся Ваши лекции

  • @crashoverride9681
    @crashoverride9681 Před 7 lety +10

    Спасибо Алексей! Лучшие лекции по Java! Респект!

  • @denisgorbikov561
    @denisgorbikov561 Před 4 lety +6

    Очень чёткая лекция и отличный лектор. Спасибо!

  • @nxllifier
    @nxllifier Před 6 lety +10

    2 дня стоял на месте в изучении данной темы, после вашей лекции произошел сдвиг)

  • @Devivl
    @Devivl Před 9 měsíci

    Посмотрел на одном дыхании. Очень интересно. Спасибо, Алексей и команде. ❤

  • @katorabian
    @katorabian Před 4 lety +5

    В принципе, лекция очень растянута по времени, однако, в поддержку лектора замечу, что материал был в должной мере исчерпывающим и затрагивающим, предвосхищающим, вопросы и аспекты, с которыми я не был знаком на момент начала лекции.
    Спасибо, за лекцию!
    UPD:// Смотрел в 1.75

  • @user-qy4dt8sx7l
    @user-qy4dt8sx7l Před 9 měsíci

    Спасибо! Супер лекция, все очень доходчиво!

  • @user-hq6nm2tf6j
    @user-hq6nm2tf6j Před 7 lety +9

    спасибо, понравилась лекция

  • @mikhails6396
    @mikhails6396 Před 2 lety +1

    Спасибо, отличная лекция

  • @user-uc5nl9vr4o
    @user-uc5nl9vr4o Před rokem

    Спасибо за лекцию!!!

  • @HAXYU_MODERN
    @HAXYU_MODERN Před 3 lety

    Оооооо! Фиолетовый чел! Здарова! Рад, рад =)

  • @nerale
    @nerale Před 3 lety +7

    Кто тоже с JavaRush?

  • @IT-no1wi
    @IT-no1wi Před 3 lety

    Отличная лекция, огромное спасибо Алексей! Но есть один вопрос, на 40:15 Вы говорите, что спящий демон еще не завершился, но виртуальная машина его все равно "прибила". Скажите, пожалуйста, а вычисляющий демон разве не был также "прибит" виртуальной машиной ?

  • @immiko7780
    @immiko7780 Před 4 lety +22

    Про volatile не полностью раскрыта тема. Volatile гарантирует что данные будут читаться из основной памяти, а не из кэша потока.

    • @slavamobile3733
      @slavamobile3733 Před 2 lety +1

      Нет, volatile этого не гарантирует

    • @yanlevchenko3870
      @yanlevchenko3870 Před 2 lety +1

      @@slavamobile3733 volatile гарантирует, что все потоки всегда будут использовать общее, исходное значение, и они будут видеть изменения этого исходного значения другими потоками сразу же.

    • @alexgorodecky1661
      @alexgorodecky1661 Před 4 měsíci

      Нет. Volatile гарантирует "volatile read" happens before "volatile write", что в следствии гарантирует sequential consistentsy

  • @vasiliyditiatkin6848
    @vasiliyditiatkin6848 Před 5 lety +6

    спасибо, чувак!!!
    разжевал и всё в клювик плюнул, как мама птица птенцу.

  • @Das.Kleine.Krokodil
    @Das.Kleine.Krokodil Před rokem

    Хорошо что указатель мыши видно

  • @user-mj7qw6ob4h
    @user-mj7qw6ob4h Před 3 měsíci

    То что вещатель разбирается в тем понятно, но объяснить толком даже не пытается, для тех, кто только учит многопоточку, после просмотра данного видео больше вопросов появится чем ответов

  • @user-fg8oo5fu6h
    @user-fg8oo5fu6h Před 3 lety +2

    28:40 - а разве метод println не потокозащищенный?

  • @alexmarkov9943
    @alexmarkov9943 Před rokem

    интересно но тяжело, дается освоение многопоточности, хотел спросить а вот по последнему примеру на синхронизацию - где по блоку синхронизации, если вместо валатайл, указать в private Singleton (аргументы ) for и zip - тоже будет некорректное событие при составление блока синхронизации? - заранее спасибо. )

  • @bigball6392
    @bigball6392 Před 4 lety +2

    вот у герберта шилдта в справочнике по жаве нашей родненькой, есть еще пару интересных штук о потоках. Советую почитать

    • @shydegenerate9967
      @shydegenerate9967 Před 4 lety

      Я же наоборот - пришел сюда, закончив читать 11 главу, сначала было все ясно, но потом застопорился на теме синхронизации потоков, там настолько все запутано, что в голове не укладывается.

    • @user-sh8zj8ij6z
      @user-sh8zj8ij6z Před 4 lety

      @@shydegenerate9967 Такая же ситуация )

  • @user-pt2lq1ik7i
    @user-pt2lq1ik7i Před 4 lety +2

    54:40 Мне кажется, не совсем корректно говорить, что мы "засыпаем" в методе synchronized при вызове wait. После того, как на объекте в блоке synchronired вызвали метод wait, поток покидает блок или метод synchronired и перемещается в "комнату ожиданий" и как только его ожидание прервали notify или notifyAll (или по тайму), он включается в борьбу за монитор на общих основаниях с остальными потоками.

  • @pilotivanovich
    @pilotivanovich Před rokem

    Лекция местами не проработана, например, нужно вначале объяснить Java model memory и happens before. И тогда правильно сказать, что race conditions - это работа с разделяемой переменной вне happens before.

  • @user-ux3ji1ek3p
    @user-ux3ji1ek3p Před 2 lety +2

    Вроде понятно все.
    Но теперь понимаю, что много чего не изучено.
    и сколько лет мне придется все учтиь =*(

  • @antonkaschin7073
    @antonkaschin7073 Před 4 lety +15

    на скорости 2x смог посмотреть

  • @KiRuFfKa
    @KiRuFfKa Před 4 lety +1

    1:06:58 - не понимаю, о какой конкретно второй нити здесь идёт речь? Мы же выше всего одну нить запустили - DepositThread(account).start()

    • @serjpavlenko
      @serjpavlenko Před 4 lety +2

      Главная нить, которую мы запустили через main.
      Она запускает параллельный процесс пополнения и пытается снять.
      Всего 2 нити.

  • @mklopotnuk
    @mklopotnuk Před 3 lety

    Поясните, с законом Амдала я не понял. Например берем 1 процессор и меняем долю вычислений, которые можно распараллелить, и при любом P, S будет равно 1, почему Алексей говорит, что в случае с N=1 график может уйти вниз. Может 1-P должно быть по модулю?

    • @komdiv4906
      @komdiv4906 Před 2 lety

      Р-не может быть более 1. Это ведь доля от целого. Если вы распаралелили 40% от всего кода, то ваше р=0.4 .Соответственно никакой модуль не требуется.

  • @tankostream
    @tankostream Před 7 lety +3

    Алексей, зачем вы стул ломаете? (в самом конце) :)

  • @slavamobile3733
    @slavamobile3733 Před 2 lety

    Почему все синхронизируются по типу в сингелтоне?

  • @user-cx4nj6io8x
    @user-cx4nj6io8x Před rokem

    Всем привет, у меня появился вопрос: в java есть многопоточность а в php нету, но в php я для задачи запускал много процессов для параллельного выполнения задачи импорта данных из файла excel для пример, в результате я на своем слабом компьютере запускал 50 процессов, которые в 50 раз быстрее и выполняли задачу(согласно затраченному времени например 12 часов при 1 процессе, а при 50 процессах 15 минут), каждый процесс ел оперативную память. Но теперь я никак не могу понять преимущества многопоточности, как я понял один поток на 1 ядро, ну например 4 ядра 4 потока и вот задача будет в 4 раза быстрее выполняться против в 50 раз быстрее php. Может что-то я не правильно понимаю, как я понял, в java есть тоже многопроцессорность, но якобы очень большие ресурсы на запуск jvm. Как-то странно у меня в голове не укаладывается php быстрее java получается в этом плане?))) Или в java можно тоже запускать 50 потоков на 4х ядерном компе, они просто будут попеременно выполнятся на ядрах.

  • @YWNWA-ZXC
    @YWNWA-ZXC Před 5 lety

    а что такое checkAmountNotNegative? у меня такого нет и даже без него работает

    • @bigball6392
      @bigball6392 Před 4 lety

      наверное метод, проверяющий, а не ушел ли баланс в минус.

  • @yourmuse3234
    @yourmuse3234 Před 4 lety +3

    Стив джобс))

  • @user-dv1nc2xo2w
    @user-dv1nc2xo2w Před rokem

    6:06 что значит вычислительные ядра? Физическое кол-во ядер или логическое? Я просто в этом не шарю

  • @SergeyDeadDenne
    @SergeyDeadDenne Před 4 lety +2

    С какого перепуга график вниз пойдёт?
    Вы его не задержите тем, что не сможете открыть след. потоки, просто проц скажет, выполняю по списку! сразу 2 потока не поддерживаю.
    График будет идти строго по 1це

    • @user-zr9zv6jr6w
      @user-zr9zv6jr6w Před 4 lety +1

      czcams.com/video/kma6T8OAQ-Q/video.htmlm53s

    • @polyackov_ot
      @polyackov_ot Před 3 lety

      @@user-zr9zv6jr6w почему все кто рассказывает про многопоточку болеют))
      пожалуй не буду изучать этот раздел, он заразный))

    • @user-zr9zv6jr6w
      @user-zr9zv6jr6w Před 3 lety

      @@polyackov_ot думаю, не всё так страшно))

    • @alexgorodecky1661
      @alexgorodecky1661 Před 4 měsíci

      С такого перепуга - накладные расходы на переключение контекста

  • @user-zv6ge2bt7j
    @user-zv6ge2bt7j Před 5 lety +4

    как поставить два лайка?

  • @sayhellotoroy
    @sayhellotoroy Před 5 lety +149

    Лайк, если перешел сюда из javarush :)

    • @GusarEvgeniy
      @GusarEvgeniy Před 5 lety +6

      Ссылка на вторую часть: czcams.com/video/umTVNoG3760/video.html

    • @user-bd3ij4op5k
      @user-bd3ij4op5k Před 5 lety +3

      гугл)

  • @user-pu1ec8jd5t
    @user-pu1ec8jd5t Před 2 lety +3

    не понял зачем нам тогда использовать volatile если можно через synchronized также все проводить и это будет давать нам ту самую атомарность

    • @_bigbro
      @_bigbro Před 2 lety +1

      вопрос не корретно поставлен.
      Volatile - это инструкция для JVM, чтобы перед чтением процессор обновил состояние переменной из оперативной памяти. чтение памяти занимает порядка 5 тактов CPU и в идеальном случае второй поток успевает выполнить 5 операций с этой переменной
      synchronized - это жесткая блокировка одного или нескольких полей класса. пока кто-то работает в синк методе, все остальные потоки тупо ждут.
      а атомик классы - они ставят блокировку в оперативной памяти. как только поток хочет изменить данные, то он ставит барьер в память и все остальные потоки встают на блокировку, пока барьер не будет снят.

    • @alexgorodecky1661
      @alexgorodecky1661 Před 4 měsíci

      На volatile переменной невозможно сделать read-modify-write операцию, так как критической секции(синхронизации) нет. С помощью volatile вы можете лишь из одного потока "отдать" данные а в другом забрать. Для реализации синхронизации нужно как минимум две volatile переменные для минимального лока Деккера, что по факту спинлок, а там и до мьютекса не далеко (synchronized)

    • @alexgorodecky1661
      @alexgorodecky1661 Před 4 měsíci

      @@_bigbro, не путайте блокировку кэш линий при атомик операциях с барьерами памяти(mfence)

  • @dibehemoth401
    @dibehemoth401 Před rokem

    А почему по формуле на одноядерном проце он график вниз нарисовал? Если N=1, то там тупо константная единица получается, нет? Ну, что и логично, ведь ток виртуальная многопоточность будет.

    • @alexgorodecky1661
      @alexgorodecky1661 Před 4 měsíci

      Накладные расходы на переключение контекста

  • @antonalekseev2694
    @antonalekseev2694 Před 6 lety +2

    Спасибо! Почти все здорово. Вот этот материал (czcams.com/video/G8XGUqZs5KI/video.html ) помог бы улучшить восприимчивость Ваших лекций.

  • @AndreyDeveloper
    @AndreyDeveloper Před 7 lety +7

    Господин Владыкин, вы меня слышите? Как у вас только наглости хватило не включить многопоточность в степик-курс? Вы нас, можно сказать, интеллектуально обокрали!

  • @kremen1571
    @kremen1571 Před 4 lety

    скорость на 1,5 и можно смотреть..

  • @aanndd739
    @aanndd739 Před 4 lety +2

    45:22 Монитор или мьютекс? Монитор - это паттерн.

  • @user-hf5ry2ni8r
    @user-hf5ry2ni8r Před 6 lety +3

    Такая интересная тема , но тут как-то скучно !

  • @Sk-gb2hx
    @Sk-gb2hx Před 4 lety +9

    на самом деле слабая лекция , не понимаю почему все хвалят , всё довольно путано , много важного осталось не озвученным