Многопоточка: основы
Повтори работу потоков и способы безопасно обращаться к общим данным. Разбери мониторы, synchronized, wait/notify, volatile и модель памяти Java, а также ситуации, когда потоки мешают друг другу: гонки, взаимные блокировки и отсутствие полезного продвижения.
Вопросы
- Чем процесс отличается от потока?
- Чем Thread отличается от Runnable? Когда нужно использовать Thread, а когда Runnable? (Ответ что тред - это класс, а ранбл интерфейс - считается не полным, нужно рассказать подробно)
- Что такое монитор? Как монитор реализован в java?
- Что такое синхронизация? Какие способы синхронизации существуют в java?
- Как работают методы wait(), notify() и notifyAll()?
- В каких состояниях может находиться поток?
- Что такое семафор? Как он реализован в Java?
- Что означает ключевое слово volatile? Почему count++ над volatile-переменной не атомарен?
- Для чего нужны Atomic типы данных? Чем отличаются от volatile?
- Что такое потоки демоны? Для чего они нужны? Как создать поток-демон?
- Что такое приоритет потока? На что он влияет? Какой приоритет у потоков по умолчанию?
- Как работает Thread.join()? Для чего он нужен?
- Чем отличаются методы wait() и sleep()?
- Можно ли вызвать start() для одного потока дважды?
- Как правильно остановить поток? Для чего нужны методы .stop(), .interrupt(), .interrupted(), .isInterrupted().
- Что такое deadlock?
- Что такое livelock?
- Что такое race condition?
- Что означает ключевое слово synchronized? Где и для чего может использоваться?
- Что является монитором у статического synchronized-метода?
- Что является монитором у нестатического synchronized-метода?
- Java Memory Model
- Миф: «volatile запрещает кэш и заставляет читать из RAM». Как на самом деле?
- Какие правила happens-before ты знаешь?
- Как работает планировщик ОС и что такое переключение контекста?
- Как устроен synchronized под капотом?
- Как избежать deadlock?