счет за волкаПожалуйста, указывайте первоисточник при перепечатке, спасибо!
От Сына Неба до простых людей, все основано на самосовершенствовании.«Университет Книги обрядов»
Г-н Ма сказал, что причин для ухода сотрудников много, но наиболее реальными являются только две:
- ДеньгиНе дано на месте
- Сердце, обиженный
Конечно, я хочу сменить платформу, изменить направление и разобраться, почему я хочу сменить работу.Если я действительно хочу сменить работу и хочу получить идеальное предложение, помимо удачи, базовые навыки должны быть твердыми Я надеюсь, что следующий опыт интервью может дать вам некоторую помощь.
###Опыт проекта Интервьюер попросит вас представиться в начале, главным образом для того, чтобы вы могли представить некоторые проекты, которые вы сделали, и посмотреть, насколько хорошо вы понимаете эти проекты, потому что в резюме многих людей проекты не пишутся от начала до конца. участвовал и реализовывал часть модулей, или брал на себя сопровождение чужих проектов, поэтому вы должны уметь разбираться в подноготной проектного опыта, написанного в резюме и в процессе собеседования, т.к. интервьюер обязательно будет задавать вопросы о принципе реализации в проекте или почему так реализовано исходя из описания вашего проекта.В этот раз вы не будете тупить и не будете знать что ответить.Эта ситуация только сильно снизит балл за собеседование.
Сценарий диалога: Интервьюер: (держит резюме) Расскажите мне об этом проекте, которым вы недавно занимались.
Я: &...%¥#*&¥@%¥! , сказал большой пасс (не знаю, сколько интервьюер слушал, интервьюер выберет те, которые ему будут задавать вопросы)
Интервьюер: Вы сказали, что в этом проекте использовалась netty. Можете ли вы рассказать о многопоточной модели netty?
Я: (к счастью, я видел исходный код netty) netty получает и обрабатывает пользовательские запросы на основе мультиплексора через модель Reactor (подробнее, если я могу говорить об этом), и внутренне реализует два пула потоков, пул потоков босса и пул рабочих потоков, в котором поток пула потоков босса отвечает за обработку события принятия запроса.При получении запроса события принятия соответствующий сокет инкапсулируется в NioSocketChannel и передается в пул рабочих потоков , где за чтение и запись запроса отвечает пул рабочих потоков.Событие (средствами диктовки и рисования примерно описывается процесс выполнения запроса, время ограничено, и дописать все детали невозможно, выберите ключевые моменты и выберите те, у которых глубокая память)
Интервьюер: Ну, понимание довольно глубокое... Тогда вы столкнулись с какими-то трудностями при выполнении этого проекта, или вы нашли его сложным?
Я: (В это время интервьюер хочет, чтобы вы сами ответили на вопрос, поэтому вы должны ответить на него. Если вы не ответите, вы не сможете выделить свой проект. Если вы не подготовили этот вопрос, вы играть можно только временно.Конечно, я принадлежу к Временно) Подумайте немного об этом, потому что я сталкивался с этой проблемой раньше.Когда я работал над этим проектом, я не был знаком с netty.Бизнес-логика запроса был обработан в потоке пула рабочих потоков, и когда был выполнен тест давления, было обнаружено, что qps не всегда может подняться.Позже, после прочтения исходного кода, я обнаружил, что, поскольку обработка бизнес-логики является временной потребляя, он полностью занимает ресурсы пула рабочих потоков, что приводит к состоянию ожидания новых запросов.
Интервьюер: Как в итоге все разрешилось?
Я: Наконец, инкапсулируйте бизнес-логику в задачу и отправьте ее в новый пул бизнес-потоков для выполнения.После выполнения пул рабочих потоков выполняет запрошенное событие записи.
Интервьюер: Ну, вы знаете, что nio selector может вызвать в нем ошибку?
Меня: ах, верно, селектор Выберите метод, поскольку базовая функция EPoll может возникнуть на холостом ходу, что приводит к тому, что CPU100%.
Интервьюер: Так как же решить эту проблему?
Я: Эта проблема была решена в netty с помощью &^%&$^ (повторите решение netty)
Интервьюер: Ну, кстати, в этом проекте вы себе индекс поставили?
Я: Да, &&…………¥¥##@, я объяснил индикаторы моего проекта, как проводить эксперименты AB и как итеративно оптимизировать индикаторы
Интервьюер: Ну, ладно, сначала проблема проекта, давайте рассмотрим основные моменты java.
Как уже упоминалось в моем проекте, конечно, конкретный проект является конкретным, и точка не спрашивает каждого интервьюера, если интервьюер не понимает Netty, естественным образом преследует проблему, но вы можете попытаться сделать проблему в направлении, с которой вы знакомы Отказ
###Очки знаний интервью
####1, пул потоков Принцип реализации пула потоков, этот пункт знаний действительно важен, почти каждое интервью будет задано, общие вопросы следующие: 1. «Расскажите о принципе реализации пула потоков» 2. "В чем разница между coreNum и maxNum в пуле потоков" 3. «Как настроить параметры пула потоков в разных бизнес-сценариях»
Сценарий диалога: Интервьюер: Как часто вы обычно используете пул потоков?
Я: Ну, я использовал это в своем *** проекте.
Интервьюер: Ну, вы говорите о принципе реализации пула потоков.
Я: (К счастью, я видел исходный код раньше, но время немного размыто), не могли бы вы дать мне ручку и бумагу, я нарисую и проанализирую это, чтобы вы могли видеть, &&¥& Предполагая инициализацию потока пул, количество основных потоков 5, максимальное количество потоков 10@@@
Интервьюер: ах, да вы продолжаете...
Я: Я нарисовал на бумаге квадрат. Это представляет собой пул потоков. При инициализации в нем нет потоков.
Интервьюер: Ну ладно, продолжайте...
Я: Я нарисовал еще один узкий прямоугольник, представляющий очередь блокировки, в которой изначально не было задач.
Интервьюер: Ну, ладно, продолжайте...
Я: Когда приходит задание, я рисую в квадрате маленький кружочек, значит инициализируется нить.Если есть другая задача, я рисую еще один кружочек, а это значит, что инициализируется еще один тред.После рисования 5 кружочков подряд , Если наступит 6-я миссия...
Интервьюер: Ну, ладно, продолжайте...
Я: В это время 6-е задание будет поставлено в очередь на блокировку..
Интервьюер: Ну и что?
Я: Разве сейчас в пуле потоков не 5 потоков, если один из потоков простаивает, он получит 6-ю задачу из очереди блокировки и выполнит ее.
Интервьюер: Ну да, а что, если задачи генерируются быстрее, чем потребляются?
Я: Если все 5 потоков пула потоков находятся в состоянии выполнения, то задача сначала сохраняется в очереди блокировки.
Интервьюер: Что делать, если очередь заполнена?
Я: Если очередь заполнена, разве мы не установили максимальное количество потоков равным 10, а в пуле потоков всего 5 потоков, то будет создан новый поток для выполнения задач, которые нельзя сохранить в блокировку очередь, а потом нарисую в квадрате еще 5 кругов.
Интервьюер: Что, если количество потоков в пуле достигло 10, очередь блокировки была заполнена, что делать?
Я: В данном случае для решения этой задачи используется пользовательская функция отклонения, и я вздыхаю с облегчением, думая, что вопрос исчерпан...
Интервьюер: Хорошо, тогда, если задачи в очереди блокировки также выполняются после выполнения в течение определенного периода времени, что произойдет с потоками в пуле потоков?
Я: ...Похоже, потоки, которые превышают количество основных потоков, будут автоматически переработаны после периода простоя... Поскольку я немного не помню эту логику, ответ немного неверен...
Интервьюер: Итак, по какому сценарию это могло бы произойти?
Я: (Иногда я действительно тупой, я много чего знаю, но когда я нервничаю во время интервью, то забываю обо всем) Это... это... я, кажется, не сталкивался с таким ситуация
Интервьюер: Ну, хорошо, подумайте об этом после того, как вы вернетесь
Я:........
Я забыл убить эту сцену
Статьи по анализу пула потоков:Углубленный анализ принципа реализации пула потоков Java
####2, реализация блокировки В процессе собеседования о блокировках основные вопросы касаются принципов реализации Synchronized и ReentrantLock, а еще больше — блокировок чтения-записи.
Сценарий диалога: Интервьюер: Вы все знаете, что такое блокировки в Java?
Я: Например, Synchronized и ReentrantLock... Я редко использую блокировки чтения-записи, поэтому не изучал их (боюсь, что меня спросят о блокировках чтения-записи, потому что я не смотрел они все время)
Интервьюер: Ну, вы впервые говорите о реализации принципа его синхронизации
Меня: ах, синхронизирован реализация блокировки JVM, где замки получаются и выпущены и контролируют директиву Monitorexit, которые, как правило, блокируют блокировку блокировки на замке внедрения, легкой и тяжелой блокировки блокировки, которые имеют тенденцию заблокировать в 1.6, Легкий замок в случае многопоточной конкуренции будет расширен в тяжелый замок, блокировка соответствующих данных хранится в заголовке объекта ... && @@ #, (ах, сказал много, интервьюер не прервал меня)
Интервьюер: О, гм, я понимаю это достаточно хорошо, тогда вы можете говорить о реализации ReentrantLock...
Я: ReentrantLock реализован на базе AQS
Интервьюер: Что такое AQS?
Я: Состояние переменной состояния будет сохранено внутри AQS, а значение переменной будет изменено через CAS. Поток, который был успешно изменен, означает, что блокировка была получена. Если модификация не удалась, или состояние состояния оказывается заблокированным, он будет инкапсулирован объектом Waiter.Thread, добавленным в очередь ожидания и приостановленным в ожидании пробуждения &&&? (опять куча)
Интервьюер: Можете ли вы рассказать о принципе реализации CAS?
Я: CAS реализован через метод compareAndSwap класса unsafe (улыбается)
Интервьюер: О, хорошо, вы знаете значение параметров этого метода?
Я: (Это меня вынуждает... Пытаюсь вспомнить, потому что действительно видел) Я думаю об этом, этот метод видел давно.Первый параметр - объект, который нужно изменить, а второй Параметр - объект, который нужно изменить. Первый параметр - смещение изменяемой переменной в объекте, третий параметр - значение до модификации, а четвертый параметр - ожидаемое измененное значение.... (Я восхищаюсь сам немного после того, как это сказал, помните это, Но интервьюер все еще, кажется, не отпускает меня...)
Опрашивающий: Ну да, вы знаете, как реализован уровень ОС?
Я: (Я пойду к твоему дяде...) Я только помню, что в X86 есть команда, начинающаяся с cmp, я забыл конкретную...
Интервьюер: Ну-ну, знаете ли вы какие-либо недостатки директивы CAS?
я: о, недостаток CAS в том, что есть проблема с ABA
Интервьюер: Как вы это говорите?
Я: Это переменная V. Если переменная V равна A при первом чтении и проверяется, что она по-прежнему равна A, когда она готова к назначению, означает ли это, что ее значение не было изменено другими потоками? ? Если в течение этого периода его значение изменится на B, а затем обратно на A, операция CAS примет его за то, что оно никогда не менялось.
Интервьюер: Как это решить?
Я: (конца нет... мое сердце разбито) В ответ на эту ситуацию параллельный пакет java предоставляет помеченный атомарный ссылочный класс "AtomicStampedReference", который можно использовать для управления версией значения переменной. правильность КАС.
Интервьюер: Ну, ладно, с этим вопросом покончено, давайте посмотрим на другие вещи.
Я: .... можно мне попить воды?
Статья про анализ блокировок, надеюсь будет вам полезна:Глубокое понимание синхронизатора Java AQS CAS в java Синхронизация простыми словами Углубленный ReentrantLock Небезопасно в Java Головоломки с ключевыми словами Java Углубленный анализ механизма реализации Object.wait/notify Углубленный анализ реализации синхронизированной JVM
####3, ConcurrentHashMap При изучении структуры данных интервьюер в начале спросит принцип реализации HashMap, когда вы скажете, что HashMap не является потокобезопасным, вас попросят представить ConcurrentHashMap самостоятельно, после чего вы можете начать следующий диалог.
Сценарий диалога: Интервьюер: Расскажите о принципе реализации ConcurrentHashMap.
Я: @#¥@@%%¥#@#¥ на основе блокировки сегмента, но реализация изменилась после версии 1.8.
Интервьюер: 1.8 Каким методом
Я: Я объяснил принцип реализации версии 1.8, в которой упоминалось красно-черное дерево...
Интервьюер: Можете ли вы объяснить концепцию красно-черного дерева?
я: Красно-черное дерево является бинарным деревом и сбалансировано...%...¥...,
Интервьюер: Кто-то, кто может говорить о красно-черных деревьях. . . . .
Я: Стоп, не спрашивайте, я знаю только, что красно-черное дерево — бинарное дерево, у него на один признак больше, чем у других деревьев, больше я ничего не знаю Интервьюер: Хорошо, тогда измените его.Вы знаете, как реализован его метод размера?
я: метод размера? Вы хотите получить количество элементов на карте?
Интервьюер: Верно....
Я: Я помню, что возврат метода размера кажется неточным, и я обычно не использую этот метод...
Интервьюер: Если вы считаете, что возвращаемое значение метода size неточное, если вы позволяете себе реализовать его, как, по вашему мнению, его следует реализовать?
Я: ...@#¥@@...глаза черные
я: подождите, дайте подумать... должна быть возможность использовать переменную AtomicInteger для логирования... ну да, каждый раз, когда вы вставляете или удаляете, манипулируете этой переменной, я гордо улыбаюсь...
Интервьюер: О, да, тогда, если я считаю, что производительность этой переменной AtomicInteger плохая, могу ли я оптимизировать ее дальше?
Я: ошарашенное лицо... (забыл тогда переменную volatile)... Вроде больше нет, не могу придумать...
Интервьюер: О, тогда взгляните на исходный код, он был реализован в jdk...
Я: Ой, не правда ли....
Интервьюер: На этом сегодняшнее интервью заканчивается, мы сообщим вам позже.
Я:..................