Вопросы для собеседования по теме Java
Вопросы о многопоточности и параллельности являются неотъемлемой частью любого собеседования по Java. Если вы хотите получить информационную должность во фронт-офисе любого фондового инвестиционного банка, вам следует подготовиться к множеству вопросов о многопоточности. Многопоточность и параллелизм — очень популярная тема в инвестиционном банкинге, особенно в связи с развитием электронной торговли. Они задают интервьюерам много запутанных вопросов по Java-потокам. Интервьюер просто хочет убедиться, что у него достаточно знаний о потоках Java и параллельной работе, потому что многие кандидаты лишь поверхностно. Электронные торговые системы с большими объемами и низкой задержкой для прямой торговли на рынке по своей сути являются параллельными. Ниже приведены вопросы по Java-потокам, которые я люблю задавать в разное время и в разных местах. Я не даю ответов, но по возможности даю подсказки, и иногда этих подсказок достаточно, чтобы ответить на вопрос. Растет число вопросов, касающихся инструментов параллелизма и параллельных коллекций, ссылающихся на пакет Java 5 Concurrency Package. Среди этих проблем более популярны ThreadLocal, Blocking Queue, Counting Semaphore и ConcurrentHashMap.
15 вопросов и ответов на собеседовании по многопоточности Java
1) Теперь есть три потока T1, T2 и T3. Как гарантировать, что T2 выполняется после выполнения T1, а T3 выполняется после выполнения T2?
Этот вопрос обычно задают во время первого раунда или на этапе телефонного собеседования, чтобы проверить, знакомы ли вы с методом «присоединения». Эта проблема многопоточности относительно проста и может быть реализована с помощью метода соединения.
2) Каковы преимущества интерфейса блокировки перед синхронизированным блоком в Java? Вам необходимо реализовать эффективный кэш, который позволяет нескольким пользователям читать, но позволяет только одному пользователю записывать, тем самым сохраняя его целостность. Как бы вы это реализовали?
Самым большим преимуществом интерфейса блокировки в многопоточном и параллельном программировании является то, что он обеспечивает отдельные блокировки для чтения и записи, что позволяет писать высокопроизводительные структуры данных, такие как ConcurrentHashMap и условную блокировку. Вопросы собеседования по Java-нитям все чаще основаны на ответах интервьюера. Я настоятельно рекомендую прочитать о Locks, прежде чем идти на многопоточное собеседование, поскольку в настоящее время он активно используется в кэшировании на стороне клиента и в пространстве торговых соединений для создания электронных торговых терминалов.
3) В чем разница между методами ожидания и сна в Java?
Вопросы для собеседования по теме Java, которые обычно задают на телефонных собеседованиях. Самая большая разница заключается в том, что ожидание снимает блокировку во время ожидания, тогда как сон всегда удерживает блокировку. Ожидание обычно используется для взаимодействия между потоками, а сон обычно используется для приостановки выполнения.
4) Используйте Java для реализации очереди блокировки.
Это относительно сложный многопоточный вопрос для собеседования, который служит многим целям. Во-первых, он может проверить, действительно ли кандидат может писать программы с использованием потоков Java; во-вторых, он может проверить понимание кандидатом сценариев параллельного выполнения, и на основе этого вы можете задать множество вопросов. Если он использует методы wait() и notify() для реализации блокирующей очереди, вы можете попросить его написать ее заново, используя новейшие классы параллелизма в Java 5.
5) Напишите код на Java для решения проблемы производитель-потребитель.
Это очень похоже на вопрос выше, но этот вопрос более классический. Иногда на собеседованиях задают следующий вопрос. Как решить проблему производитель-потребитель в Java. Конечно, я поделился методом, использующим блокировку очередей. Иногда даже спрашивают, как решить задачу обедающих философов.
6) Если вы запрограммируете программу на Java, которая вызовет взаимоблокировку, как вы ее решите?
Это мой любимый вопрос на собеседовании по Java, потому что, несмотря на то, что проблемы взаимоблокировок очень распространены при написании многопоточных параллельных программ, многие кандидаты не могут писать код без взаимоблокировок (код без взаимоблокировок?) и испытывают трудности. Просто скажите им, что у вас есть N ресурсов и N потоков и вам нужны все ресурсы для завершения операции. Для простоты n здесь можно заменить на 2. Чем больше данных, тем сложнее будет проблема. Получите дополнительную информацию о взаимоблокировках, избежав взаимоблокировок в Java.
7) Что такое атомарные операции? Что такое атомарные операции в Java?
Очень простой вопрос для собеседования по Java-потоку. Следующий вопрос заключается в том, что вам нужно синхронизировать атомарную операцию.
8) Какова ключевая роль изменчивости в Java? Как его использовать? Чем он отличается от синхронизированных методов в Java?
С тех пор как Java 5 и модель памяти Java изменились, проблемы многопоточности, основанные на ключевом слове Volatible, становятся все более популярными. Вы должны быть готовы ответить на вопросы о том, как изменчивые переменные обеспечивают видимость, порядок и согласованность в параллельной среде.
9) Что такое состояние гонки? Как выявить и устранить конкуренцию?
Этот вопрос возникает на поздних стадиях многопоточных интервью. Большинство интервьюеров спросят о конкурентной ситуации, с которой вы недавно столкнулись, и о том, как вы ее решили. Иногда они пишут простой код и позволяют обнаружить в нем условия гонки. Вы можете обратиться к моей предыдущей статье об условиях гонки в Java. По моему мнению, это один из лучших вопросов для собеседования по Java, он может точно определить опыт кандидата в решении условий гонки или написании кода, свободного от гонки данных или любого другого состояния гонки (это предложение, свободное от гонки данных, будет не переводить). Лучшая книга на эту тему — «Практики параллелизма в Java».
10) Как вы будете использовать дамп потока? Как бы вы проанализировали дамп потока?
В UNIX вы можете использовать kill -3, и дамп потока распечатает журнал, в Windows вы можете использовать «CTRL+Break». Очень простой и профессиональный вопрос для собеседования, но сложный, если вас спрашивают, как его анализировать.
11) Почему метод run() выполняется, когда мы вызываем метод start(). Почему мы не можем вызвать метод run() напрямую?
Это еще один классический вопрос для собеседования по многопоточности Java. Это также привело меня в замешательство, когда я впервые начал писать программы потоков. В настоящее время этот вопрос обычно задают на телефонных собеседованиях или в первом раунде собеседований по Java от начинающего до среднего уровня. Ответ на этот вопрос должен быть таким: когда вы вызываете метод start(), вы создаете новый поток и выполняете код в методе run(). Но если вы вызовете метод run() напрямую, он не создаст новый поток и не выполнит код вызывающего потока. Прочтите мою предыдущую статью «Разница между методами Start и Run» для получения дополнительной информации.
12) Как разбудить заблокированный поток в Java?
Это сложный вопрос о потоках и блокировке, и у него есть много решений. Я не думаю, что есть способ прервать поток, если он встретит блок ввода-вывода. Если поток заблокирован вызовом wait(), Sleep() или join(), вы можете прервать поток и разбудить его, вызвав InterruptedException. Моя предыдущая статья «Как бороться с методами блокировки в Java» содержит много информации о блокировке потоков.
13) В чем разница между CycliBarriar и CountdownLatch в Java?
Этот вопрос в основном используется для проверки того, знакомы ли вы с пакетом concurrent в JDK5. Разница между ними заключается в том, что CyclicBarrier может повторно использовать пройденные барьеры, а CountdownLatch нельзя использовать повторно.
14) Что такое неизменяемый объект и как он помогает писать параллельные приложения?
Еще один классический вопрос на собеседовании о многопоточности, он не имеет прямого отношения к тредам, но косвенно очень помогает. Этот вопрос на собеседовании по Java может оказаться очень сложным, если он попросит вас написать неизменяемый объект или спросит, почему String является неизменяемым.
15) С какими типичными проблемами вы сталкиваетесь в многопоточных средах? Как вы это решили?
В многопоточных и параллельных программах обычно встречаются такие проблемы, как интерфейс памяти, состояния гонки, взаимоблокировка, активная блокировка и голодание. Проблемы бесконечны, и если вы ошибетесь, их будет трудно найти и отладить. В основном это вопросы, основанные на собеседованиях, а не практические вопросы по Java-потокам.
Несколько дополнительных вопросов:
1) В чем разница между зелеными потоками и локальными потоками в Java?
2) В чем разница между потоком и процессом?
3) Что такое переключение контекста в многопоточности?
4) В чем разница между тупиком и живой блокировкой, а также между тупиком и пирогом?
5) Какой алгоритм планирования потоков используется в Java?
6) Что такое планирование потоков в Java?
7) Как вы обрабатываете неперехватываемые исключения в потоках?
8) Что такое группа потоков и почему она не рекомендуется в Java?
9) Почему лучше использовать фреймворк Executor, чем использовать приложение для создания потоков и управления ими?
10) В чем разница между Исполнителем и Исполнителями в Java?
11) Как узнать, какой поток использует больше всего процессорного времени в Windows и Linux?