Что важно знать
- Поток останавливают прерыванием, а не
stop. synchronized— монитор объекта, взаимное исключение и видимость.wait/notify— только в цикле с условием.ReentrantLock—tryLockс таймаутом, справедливость, несколько условий.
Создание и состояния потоков, synchronized, wait/notify, явные блокировки.
stop.synchronized — монитор объекта, взаимное исключение и видимость.wait/notify — только в цикле с условием.ReentrantLock — tryLock с таймаутом, справедливость, несколько условий.Практика. Сделать потокобезопасный счётчик и банковский перевод между счетами без гонок.
Практика. Воспроизвести взаимную блокировку, найти её через jstack и исправить порядком захвата.
Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.
Thread — сам поток выполнения. Runnable — задача без результата (void run()), Callable<V> — задача с результатом V call(), которая может бросить проверяемое исключение.
Полный разборvolatile — видимость и порядок для одной переменной без блокировки. synchronized — видимость плюс взаимное исключение: блок целиком выполняется одним потоком, поэтому составные действия становятся атомарными.
Полный разборtryOptimisticRead даёт метку, данные читаются без блокировки, затем validate проверяет, не было ли записи; не прошла — повтор или обычная блокировка чтения. Ограничения: данные между меткой и проверкой могут быть несогласованными, и StampedLock не…
Полный разборstart() создаёт новый поток, и уже он вызывает run(); прямой run() выполняется в текущем потоке, как обычный метод.
Полный разборDeadlock — циклическое ожидание: поток A держит замок 1 и ждёт замок 2, поток B держит 2 и ждёт 1. Предотвращают единым порядком захвата, tryLock с таймаутом и откатом, короткими критическими секциями без вызова чужого кода под замком.
Полный разборsynchronized даёт взаимное исключение (один поток в блоке по данному монитору) и видимость изменений для следующего вошедшего.
Полный разборunlock() — в finally, а lock() — перед try: иначе исключение в критической секции оставит замок захваченным навсегда.
Полный разборThreadLocal — своя ячейка значения для каждого потока: синхронизация не нужна, потому что значение никто не разделяет.
Полный разборThread и Runnable, стоимость платформенных потоков, состояния жизненного цикла, кооперативное прерывание и daemon-потоки.
Взаимное исключение и видимость через монитор, reentrancy, guarded blocks с wait/notify и причины deadlock.
Когда synchronized мало, ReentrantLock с tryLock/fairness, ReadWriteLock и StampedLock, Condition вместо wait/notify.
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.