Что произойдет, если виртуальный поток заблокируется внутри `synchronized` блока при выполнении долгой I/O операции?
Anonymous Quiz
30%
Виртуальный поток корректно освободит системный поток ("отпаркуется").
46%
Произойдет "закрепление" (pinning): системный поток будет заблокирован вместе с виртуальным.
16%
Виртуальный поток автоматически превратится в обычный платформенный поток.
8%
Ошибка RuntimeException.
🔥4
🔍 Ответ на задачу про Virtual Threads: Опасность synchronized 📌
В текущей реализации , начиная с Java 21 виртуальные потоки не могут освобождать системный (carrier) поток, если они находятся внутри
Вывод:
Системный поток будет заблокирован (ответ 2). Рекомендуется использовать
⚡️ Не перепутайте:
Это не значит, что
#java #java21 #virtualthreads #loom #concurrency #интервью #java_interview_tasks
В текущей реализации , начиная с Java 21 виртуальные потоки не могут освобождать системный (carrier) поток, если они находятся внутри
synchronized блока или вызывают нативный метод. Это называется Pinning. Если ваш код делает тяжелые сетевые вызовы внутри synchronized, вы можете забить все системные потоки и свести на нет всю пользу от виртуальных потоков.Вывод:
Системный поток будет заблокирован (ответ 2). Рекомендуется использовать
ReentrantLock, так как он не вызывает закрепления потока.⚡️ Не перепутайте:
Это не значит, что
synchronized — зло. Если операция внутри блока быстрая (просто инкремент), закрепление не будет проблемой.#java #java21 #virtualthreads #loom #concurrency #интервью #java_interview_tasks
👍4🔥1
Devoxx Belgium 2026 только закончилась:
https://youtube.com/playlist?list=PLKlmOVksNGoE&si=_BvX8q8qFK4hR4ig
https://youtube.com/playlist?list=PLKlmOVksNGoE&si=_BvX8q8qFK4hR4ig
🔥3
Что произойдет, если поток вызовет `tryLock()`, а замок уже занят другим потоком?
Anonymous Quiz
42%
Поток будет ждать (заблокируется), пока замок не освободится.
42%
Поток сразу напечатает "Busy" и пойдет дальше.
11%
Выбросится IllegalMonitorStateException.
5%
Произойдет Deadlock.
🔥3
Что произойдет, если поток вызовет
tryLock(), а замок уже занят другим потоком?ReentrantLock lock = new ReentrantLock();
// ... где-то в другом потоке lock.lock() ...
if (lock.tryLock()) {
try { /* работа */ }
finally { lock.unlock(); }
} else {
System.out.print("Busy");
}
🤯4❤1
🔍 Ответ на задачу про ReentrantLock: Попытка не пытка 🚪
Метод
Вывод:
Поток напечатает "Busy" и не будет блокироваться.
⚡️ Не перепутайте:
При использовании
#java #concurrency #multithreading #reentrantlock #интервью #java_interview_tasks
Метод
tryLock() — неблокирующий. Он мгновенно возвращает true, если замок удалось захватить, и false, если нет. Это позволяет потоку избежать ожидания и заняться чем-то другим или реализовать свою логику повторных попыток.Вывод:
Поток напечатает "Busy" и не будет блокироваться.
⚡️ Не перепутайте:
При использовании
lock() всегда вызывайте unlock() в блоке finally. Со synchronized об этом заботится сама JVM.#java #concurrency #multithreading #reentrantlock #интервью #java_interview_tasks
🔥4👍1🤨1
🤨6
Что выведет этот код?
Semaphore sem = new Semaphore(0);
sem.release();
sem.release();
System.out.println(sem.availablePermits());
🥴5
🔍 Ответ на задачу про Semaphore: Кто потерял ключи? 🔑
В отличие от многих других синхронизаторов,
Вывод:
Код напечатает 2. Это свойство часто используют для передачи сигналов между потоками: один поток ждет (
⚡️ Не перепутайте:
Если вам нужен строгий замок, где отдать ключ может только тот, кто его взял — используйте
#java #concurrency #semaphore #multithreading #интервью #java_interview_tasks
В отличие от многих других синхронизаторов,
Semaphore в Java — это просто счетчик. Метод release() просто увеличивает счетчик разрешений на единицу. Ему совершенно всё равно, вызывали ли вы acquire() до этого.Вывод:
Код напечатает 2. Это свойство часто используют для передачи сигналов между потоками: один поток ждет (
acquire), а другой подает сигнал о готовности (release).⚡️ Не перепутайте:
Если вам нужен строгий замок, где отдать ключ может только тот, кто его взял — используйте
ReentrantLock.#java #concurrency #semaphore #multithreading #интервью #java_interview_tasks
🔥3❤1👍1
Можно ли повторно использовать `CountDownLatch`, когда его счетчик достиг нуля?
Anonymous Quiz
23%
Да, вызвав метод `reset()`.
11%
Да, он автоматически сбрасывается.
54%
Нет, это "одноразовый" затвор.
12%
Только если создать его с флагом `isReusable=true`.
🔥1
🔍 Ответ на задачу про CountDownLatch vs CyclicBarrier: Одноразовый или нет? 🏁
-
-
Вывод:
⚡️ Не перепутайте:
- Нужен старт нескольких потоков одновременно?
- Нужно дождаться завершения инициализации чего-либо?
#java #concurrency #multithreading #latch #barrier #интервью #java_interview_tasks
-
CountDownLatch — одноразовый. Как только счетчик упал до нуля, все потоки проходят через await() свободно, и "взвести" его обратно нельзя.-
CyclicBarrier — многоразовый. После того как все потоки собрались в точке сбора, барьер сбрасывается и готов к следующему раунду (циклу). У него есть метод reset().Вывод:
CountDownLatch нельзя использовать повторно⚡️ Не перепутайте:
- Нужен старт нескольких потоков одновременно?
CyclicBarrier.- Нужно дождаться завершения инициализации чего-либо?
CountDownLatch.#java #concurrency #multithreading #latch #barrier #интервью #java_interview_tasks
❤3
Что произойдет, если положить большой объект в `ThreadLocal` и не вызвать `remove()` в приложении, работающем на Tomcat/Jetty?
Anonymous Quiz
17%
Объект будет удален сборщиком мусора, когда поток закончит обработку HTTP-запроса.
69%
Объект останется в памяти, так как потоки в веб-серверах живут в пуле и не умирают.
2%
ThreadLocal сам очистится через 5 минут простоя.
12%
JVM принудительно очищает ThreadLocal при каждой очистке Heap.
🔥2
🔍 Ответ на задачу про ThreadLocal: Утечка памяти в серверах 🚰
Веб-серверы используют ThreadPool. Поток не умирает после завершения запроса, а возвращается в пул. Если вы привязали к нему данные через
Вывод:
Объект останется в памяти. Всегда вызывайте
⚡️ Не перепутайте:
В современных Java (21+) для таких целей лучше использовать
#java #threadlocal #memoryleak #jvm #backend #интервью #java_interview_tasks
Веб-серверы используют ThreadPool. Поток не умирает после завершения запроса, а возвращается в пул. Если вы привязали к нему данные через
ThreadLocal и не удалили их, эти данные будут висеть в памяти вечно (или пока поток не будет пересоздан), так как на них есть ссылка из живого потока.Вывод:
Объект останется в памяти. Всегда вызывайте
threadLocal.remove() в блоке finally после завершения работы.⚡️ Не перепутайте:
В современных Java (21+) для таких целей лучше использовать
Scoped Values, которые гарантируют очистку данных после выхода из блока.#java #threadlocal #memoryleak #jvm #backend #интервью #java_interview_tasks
❤3👍2🔥1