Лекция 11. Многопоточность в Java
HTML-код
- Опубликовано: 5 фев 2025
- Знакомство с языком с самых азов, но глубоко. Преподаватель - Тагир Валеев. Подробнее о курсе: compscicenter....
Все лекции курса по порядку: • Программирование на Ja...
Подписывайтесь на наш канал: / compscicenter
Подробнее о поступлении в CS центр: compscicenter....
Следите за новостями и анонсами:
compsci...
t.me/compscice...
Поддержать CS центр:
compscicenter....
Спасибо вам, Тагир. Понравилось, что сперва обсуждаем проблемы , и постепенно решая их приходим к современному подходу)
Еще понравилось, что лекция дает понимание процессов происходящих в железе. Для меня, например, было открытием, что процессор принимает кеш линию целиком
Очень классно! Спасибо!
good video и для сениора норм ))
можно ссылку на исходники?
Интересно, а как мы можем вычитать во 2-м потоке то, что INSTANCE не null?
Спасибо
Видео огонь
29:43 Подскажите, пожалуйста, как получить доступ к приватному статическому полу list класса Container?
Никак, на то он и приватный.
можно достать через рефлекшн, но это такой себе вариант, т.к. можно поломать всю программу
Ну просто не компилируется🤷♂️
@@John_Smith_Java геттер в классе Container создать нужно. тут это упустили для простоты восприятия.
@@АндрейКолосовский-я4р скорее всего скрин из класса Container метода main. И обращение было к приватному полю объекта внутри самого класса объекта.
А есть возможно качество видео улучшить до 1080?
натренируй нейросеть и залей туда видео)
Динамика на графиках о процессорах не соответствует тексту лектора 🤔
Вопрос не про потоки, а про оптимизацию и перестановки:
private boolean initialized = false; // not volatile
private Object obj = null; // not volatile
public void doIt {
if (!this.initialized) {
this.obj = init(); // (1) throw RuntimeException
this.initialized = true; // (2)
}
}
код однопоточный. Может ли произойти оптимизация и шаг 2 произойдет раньше шага 1?
Зависит от того - связаны обьект и переменная друг с другом. Т.е. если внутри инициализации обьекта есть код, который использует переменную - значит связаны. Если нет - значит не связаны.
Эту связь будет определять компилятор при сборке кода.
Если связь есть - компилятор будет гарантировать заданную в коде последовательность выполнения.
Если связи нет - то действительно да, переменная может стать true раньше, чем инициализация обьекта.
Но в контексте однопоточной программы - для программиста это не имеет значения, код будет выполняться корректно и так и так.
В контексте многопоточки - свои ньюансы конечно.
Это в C++ так. В яве - скорее всего то же самое. Поправьте, если ошибаюсь.
Забавно, примерная аналогия ситуации в вопросе - "эффект наблюдателя" в квантовой физике :)
@@aanoonymouss , почему корректно в однопоточке? Булево поле установлено, но инициализация по факту не прошла (исключнние). При следующей попытке не произойдет, т.к. проверяется установленное булево поле, а не сам объект.
@@kotbajan
По условию - код однопоточный. О каких "при следующей попытке не произойдет" идет речь?
Правда, несколько раз перечитал сообщение - нихера не понял, о чем ты...
Перефразируй и поясни плиз
@@aanoonymouss , например, шедулер на 1 потоке. Либо вызов одного и того же метода несколько раз в рамках одного алгоритма. Создаем объект, дергаем doIt(), получаем exception (1) и расчитываем, что флаг инициализации (2) не был взведен. Ждем какое-то время и делаем еще одну попытку. Смены потока нет - код однопоточный. Но если оптимизатор поменял местами строки, в this.obj навсегда останется значение по умолчанию.
@@kotbajan
Ок, теперь понял.
Интересный вопрос!
Подтвердить свои слова не могу - но нутром чую, что исключение не даст выполниться изменению переменной.
Почему чую - потому что иначе весь наш говнокод перестел бы работать, и самолеты начали бы падать. Но самолеты летают, и код работает так, как мы ожидаем.
Я плюсовик, но - присоединюсь к вопросу.
Эй народ - может ли произойти реордеринг между вызовом функции и изменением переменной?
Как по мне - нет. Потому что реордеринг может быть только между инструкциями, а вызов функции - это новая пачка инструкций?
edit: для уточнения понимания - в моем ответе стоит заменить "инструкции" на "операции"
Вопрос: а есть ли книга, где можно про все это почитать?
"Java Concurrency in Practice" Брайан Гетц
@@dioflok26 далеко не все описано в этой книге. все же последнее издание от 2004 или 2006 года
@@-maxxxeffectИз этой лекции там есть все
Семь моделей конкуренции за семь недель
компьютьэры прям режет слух
а меня скрутило от "доступиться" )