Шпаргалка Java · Senior
Компактная шпаргалка «триггер-вопрос → готовый короткий ответ» для быстрого повторения перед собесом уровня Senior по всем ключевым темам Java-разработки, с цветовой кодировкой карточек по риску (база / частое / ловушка).
Что внутри — разделы
- 01 Java Core и Collections
- 02 JVM под нагрузкой
- 03 Многопоточность
- 04 Spring
- 05 PostgreSQL
- 06 Kafka
- 07 Архитектура микросервисов
- 08 Обмен между сервисами и кэш
- 09 DevOps и эксплуатация
- 10 Безопасность
- 11 Наблюдаемость и инциденты
- 12 AI в продакшене и зрелость
- 13 Алгоритмы и структуры данных
- 14 System Design кейсы
- 15 Live-coding и разбор кода
- 16 Топ-30 Senior-ловушек
- ⏱ Если осталось 5 минут
Примеры карточек
Формат шпаргалки: триггер-вопрос → готовый короткий ответ. Ниже — открытые примеры; все карточки по всем разделам — в полной версии.
Что такое happens-before?
Частичный порядок над действиями (чтение, запись, захват и освобождение блокировки): если A предшествует B по этому порядку, все результаты A видны в B. Порядок транзитивен.
Даёт ли synchronized по локальному объекту видимость между потоками?
Нет. Барьер компилятор поставит, но связи happens-before не возникает: этот монитор больше никто не берёт. Синхронизация работает, только когда потоки берут один и тот же монитор.
Что такое pinning виртуальных потоков?
Виртуальный поток застрял на carrier thread и не отдаёт его. Бывает внутри synchronized и в нативных вызовах: носитель заблокирован, пул носителей быстро исчерпывается. В Java 24 pinning на synchronized убрали.
Поставили целевую паузу 50 мс на G1 — что будет?
Молодых сборок станет втрое больше, а пропускная способность упадёт примерно на 20 процентов. G1 честно ужимает молодое поколение, чтобы уложиться в заданную цель.
REQUIRES_NEW внутри существующей транзакции при пуле на 10 соединений?
Десять параллельных запросов займут по соединению и будут ждать второе из того же пула — взаимная блокировка. Признак в логах: сообщение о недоступности соединения по таймауту.
Что такое переполнение счётчика транзакций?
Счётчик транзакций (XID) 32-битный, поэтому старые версии строк VACUUM должен замораживать — иначе после переполнения они оказались бы «из будущего» и стали невидимыми. На подходе к пределу PostgreSQL перестаёт выдавать новые XID и отклоняет пишущие транзакции, пока VACUUM не заморозит старые строки. Раньше для этого базу запускали в однопользовательском режиме.
Бывает ли доставка ровно один раз из Kafka в базу?
Нет, это миф. Гарантия действует только между темами Kafka. Для базы нужна идемпотентность по бизнес-ключу: двухфазной фиксации в Kafka нет.
Каков правильный порядок обёрток отказоустойчивости?
Снаружи повтор, под ним Circuit Breaker, затем TimeLimiter, а Bulkhead — самый внутренний. Так каждая попытка повтора проходит через Circuit Breaker и учитывается, а после его открытия оставшиеся попытки сразу получают отказ. Если повтор внутри, вся серия выглядит для Circuit Breaker одним вызовом, и он открывается с опозданием.
Полная шпаргалка — все триггер-вопросы по всем 17 разделам с ответами и цветокодом (база / частое / ловушка) — в JavaJub Pro.