Разбираем на примере, как работает ключевое слово synchronized в Java. Исходники: github.com/Arh... Поддержать канал💰: yoomoney.ru/to... #ArhiTutorialsJava #ityoutubersru
Синхронайзд используется для синхронизации доступа к какому-то объекту из нескольких потоков. То есть этот объект один для всех потоков, и если внутри его методов есть синхронайзд на this то этот this для всех потоков одинаковый.
Доброго времени суток!Подскажите, заинтересовал такой вопрос, ответ на который я так и не нашел. java поддерживает многопоточность(имея ввиду пакет java.util.concurrent). Но правильно ли я понимаю что это вид многопоточности с разделением времени, все созданные потоки выполняются в рамках одного процесса и одним ядром процессора. Т.е. когда мы создаем и запускаем подпотоки то все они выполняются "псевдопараллельно", процессор просто перемещается между этими потоками? Но как я понимаю никакой поддержки многопроцессорных систем(многоядерных), здесь нет? Так же, в java есть fork/join framework - в котором, насколько я понял , как раз осуществляется реальное многопоточное(многоядерное) программирование. Если есть возможность, поясните! Спасибо!
Потоки в Java - это надстройка над потоками операционной системы. Они работают параллельно и занимают все свободные ядра. fork/join framework предназначен для случаев, когда задачи порождают дочерние задачи. Причем задач много и выполняются они быстро. В этом случае на обычном пуле их выполнять невыгодно, потому что потоки все время будут ломиться в очередь, чтоб добавить туда свои задачи, и большую часть времени будут простаивать в заблокированном состоянии, ожидая доступа к очереди, вместо того, чтоб заниматься работой.
Потому что стрингбуфер обеспечивает синхронизацию только внутри своих методов. Но там в Runnable его методы вызываются 3 раза. Между этими вызовами может вклинится другой поток и выполнить свой вызов. То есть, например, пустую строку записать. Тогда получится, к примеру, что на 3-й строке пустая строка, а на четвертой сразу 2 текста. Чтоб всегда было все одинаково нужен synchronized блок на все 3 вызова, тогда другой поток не сможет вмешаться.
Вопрос. Зачем использовать synchronization в реальной жизни? Если задачи выполняются одна за другой, а не параллельно, разве это всё ещё является МНОГОпоточность? В чем преимущества?
Синхронизация нужна только в тех местах, где есть какие-то ресурсы, к которым может обращаться одновременно несколько потоков. Например, если есть очередь задач, из которой потоки берут задачи и выполняют, то доступ к очереди должен быть синхронизирован, чтоб не было накладок типа того, что два потока одну задачу возьмут. А сами задачи уже можно выполнять параллельно. В общем, обычно синхронизацию используют по минимуму и только в необходимых местах.
Если внутри метода run имеется 2 блока синхронизации на разных объектах, первый поток захватывает первый монитор, второй заходит в метод и блокируется, ожидания освобождения монитора, разве не так? (В видео говорится о том, что другой поток захватит монитор другого блока синхронизации)
Автор и его канал - находка. Как же все доходчиво. Спасибо.
Мне очень нравится такой формат: короткие видео с большим количеством информации, без запинок и лишних слов!
👍*Хорошее примечание*, "если все обернуть в синхронайзд, то смысл многопоточности пропадает".
Благодарю за примеры.
Все видео сидел и думал "а смысл тогда в разных потоках?", чтобы в конце услышать, что да, его нет, если обернуть прям все-все.
Замечательное видео! Самое понятное из всех просмотренных по теме. Спасибо большое
Действительно, многопоточность очень важная тема, где легко можно ошибиться. Спасибо!
Очень приятное изложение материала. Кратко и по сути.
Спасибо!
Крутое видео)
Сказал всё, что нужно. Максимально быстро и понятно. 5+
Спасибо.У Вас понятные примеры.
Спасибо, простое и понятное ознакомление!
просто гений, спасибо
Спасибо. Отличное обьяснение.
Спасибо, именно в этом видео я получил ответы на свои вопросы
Благодарю, это то что было нужно мне.
Жаль что второй раз подписаться нельзя))))
круто, как же круто ты объясняешь, спасибо
Очень приятно и просто
Мужик респект и уважуха!
Спасибо вам огромное!
Спасибо. с монитором - уже что-то прояснилось
вопрос. если синхронайз по this/ какой обьект лочится? ведь у каждого потока будет свой this и потоки должны одновременно выполнятся?
Синхронайзд используется для синхронизации доступа к какому-то объекту из нескольких потоков. То есть этот объект один для всех потоков, и если внутри его методов есть синхронайзд на this то этот this для всех потоков одинаковый.
@@arhitutorials если поток заходит в синхронизированный метод (this) какой обьект находится в этом this?/какой обьект лочится?
@@vass8180 если нет подходящего общего объекта для синхронизации можно его создать.
Если вызвать синхронайзд метод на объекте, то лочится этот объект.
Чувак, ты топ, объясняешь как Алишев. Дал бы ты рекламу и сделал курс базовый на java, срубил бы бабла на ютабчике :D
Доброго времени суток!Подскажите, заинтересовал такой вопрос, ответ на который я так и не нашел.
java поддерживает многопоточность(имея ввиду пакет java.util.concurrent). Но правильно ли я понимаю что это вид многопоточности с разделением времени, все созданные потоки выполняются в рамках одного процесса и одним ядром процессора. Т.е. когда мы создаем и запускаем подпотоки то все они выполняются "псевдопараллельно", процессор просто перемещается между этими потоками? Но как я понимаю никакой поддержки многопроцессорных систем(многоядерных), здесь нет?
Так же, в java есть fork/join framework - в котором, насколько я понял , как раз осуществляется реальное многопоточное(многоядерное) программирование.
Если есть возможность, поясните! Спасибо!
Потоки в Java - это надстройка над потоками операционной системы. Они работают параллельно и занимают все свободные ядра.
fork/join framework предназначен для случаев, когда задачи порождают дочерние задачи. Причем задач много и выполняются они быстро. В этом случае на обычном пуле их выполнять невыгодно, потому что потоки все время будут ломиться в очередь, чтоб добавить туда свои задачи, и большую часть времени будут простаивать в заблокированном состоянии, ожидая доступа к очереди, вместо того, чтоб заниматься работой.
@@arhitutorials Спасибо за развернутый ответ!
Спасибо, но почему даже со стрингбуфером третья строка пустая иногда?
Потому что стрингбуфер обеспечивает синхронизацию только внутри своих методов. Но там в Runnable его методы вызываются 3 раза. Между этими вызовами может вклинится другой поток и выполнить свой вызов. То есть, например, пустую строку записать. Тогда получится, к примеру, что на 3-й строке пустая строка, а на четвертой сразу 2 текста. Чтоб всегда было все одинаково нужен synchronized блок на все 3 вызова, тогда другой поток не сможет вмешаться.
Вопрос. Зачем использовать synchronization в реальной жизни? Если задачи выполняются одна за другой, а не параллельно, разве это всё ещё является МНОГОпоточность? В чем преимущества?
Синхронизация нужна только в тех местах, где есть какие-то ресурсы, к которым может обращаться одновременно несколько потоков. Например, если есть очередь задач, из которой потоки берут задачи и выполняют, то доступ к очереди должен быть синхронизирован, чтоб не было накладок типа того, что два потока одну задачу возьмут. А сами задачи уже можно выполнять параллельно.
В общем, обычно синхронизацию используют по минимуму и только в необходимых местах.
Если внутри метода run имеется 2 блока синхронизации на разных объектах, первый поток захватывает первый монитор, второй заходит в метод и блокируется, ожидания освобождения монитора, разве не так? (В видео говорится о том, что другой поток захватит монитор другого блока синхронизации)
Добрый вечер, я пока плохо в этом разбирась... Возник вопрос - как мы можем создать объект типа Runnable, ведь Runnable это интерфейс?
На самом деле создаётся класс без имени, наследующий Runnable, и тут же на месте создаётся экземпляр этого класса, по этому все нормально.
Спасибо большое за ответ
создается анонимный класс
8 минут половина справочника Шилдта о многопоточности
Сори
Полезно, но музыка дебильная 😀