Компания Huawei вступила во второй этап и готова спешить!
Компания Huawei вступила во второй этап и готова спешить!
Привет всем, я Сяолинь.
Полный процесс собеседования в Huawei 3 Раунд технический аспект +1 колесо hr лапша,существовать До встречи,Все равно сначала придется провести машинный тест,В основном все вопросы по даалгоритму,Если вы наберете 150 баллов, вы пройдете компьютерный тест.,Затем就进行后лапшаиз技术лапша试。
Собеседования в Huawei немного проще, чем в интернет-компаниях. Они не задают слишком глубоких технических вопросов и не задают много вопросов. Они задают всего около 10-20 вопросов по сравнению с собеседованиями в крупных интернет-компаниях. часто задают 30 вопросов. Это проблема, давление действительно относительно небольшое.
Сегодня я хотел бы поделиться с вами опытом собеседования одноклассника из Huawei. Технологический стек интервьюера — Java. В основном он спрашивал о Spring, Java-коллекциях, concurrency, network и mysql. 方лапшаизвопрос,А такжеиметьрвать рукамиалгоритмизпроцесс。
стереотипы
Каковы уровни изоляции транзакций в Spring?
В Spring существует 5 уровней изоляции транзакций:
DEFAULT:Уровень изоляции транзакций по умолчанию в Spring,соединитьизданные Библиотекауровень изоляции транзакции С учетом;
READ_UNCOMMITTED: читать незафиксированные,Также называется незафиксированным чтением,На этом уровне изоляции издела можно увидеть другие дела, которые не представлены изданными. Этот уровень изоляции может учитываться и в других незавершенных и зданных делах.,И незафиксированные изданные можно откатить,Итак, мы читаем этот уровень в изданные и называем его грязными данными.,Назовите эту проблему грязным чтением;
READ_COMMITTED: чтение зафиксировано,Также называется чтением фиксации,Издела этого уровня изоляции можно прочитать уже представленные делаизданные.,Поэтому у него не будет проблем с грязным чтением. Но поскольку существующиеделаиз может читать другие дела, представленные результаты во время выполнения,таксуществоватьв разные временаиз одного и того же SQL В ходе запроса могут быть получены разные результаты. Это явление называется неповторяемым чтением;
REPEATABLE_READ: повторяемое чтение,Это может гарантировать, что результаты нескольких запросов для одного и того же запроса являются согласованными. Но будут и новые проблемы,Например, когда этот уровень выполняется,Другие дела успешно вставили определенные данные,Но поскольку каждый раз, когда его запрашивают, результаты одни и те же.,Поэтому эти данные не будут запрошены.,Когда я вставлял его повторно, снова произошел сбой (из-за уникального ограничения). Очевидно, что эту информацию невозможно найти в существующихделах.,Но я не могу его вставить сам,Это называется фантомным чтением;
SERIALIZABLE: сериализация, высший уровень. изоляции транзакции,Это заставит сортировать дела,чтобы не было конфликта,Это решает проблемы грязного чтения, неповторяемого чтения и фантомного чтения.,Но из-за низкой эффективности исполнения,Так что реальных сценариев использования не так много.
так,по сравнению с MySQL Уровень изоляции транзакции, Spring Еще одна вещь DEFAULT уровень изоляции транзакции。Для разныхизуровень изоляции,Явление также может быть разным, когда делались одновременно.
То есть:
На уровне изоляции «чтение без фиксации» могут происходить грязные чтения, неповторяемые чтения и фантомные чтения;
На уровне изоляции «Read Commit» могут происходить неповторяющиеся чтения и фантомные чтения, но грязные чтения маловероятны;
На уровне изоляции «повторяемое чтение» может происходить фантомное чтение, но «грязное» и неповторяющееся чтение невозможно;
На уровне изоляции «сериализация» маловероятно возникновение грязных операций чтения, неповторяемых операций чтения и фантомных операций чтения.
Каково поведение распространения транзакций Spring?
существоватьSpringот среднего доделаиз Коммуникативное поведение определяет семь типовда:REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED。
Поддерживает текущую транзакцию: REQUIRED, SUPPORTS, MANDATORY; не поддерживает текущую транзакцию: REQUIRES_NEW, NOT_SUPPORTED, NEVER и вложенные транзакции NESTED, где REQUIRED — уровень распространения транзакции по умолчанию.
Тип поведения распространения транзакции
иллюстрировать
PROPAGATION_REQUIRED
Если текущей транзакции нет, создайте новую транзакцию. Если транзакция уже существует, добавьте ее в эту транзакцию. Это наиболее распространенный выбор.
PROPAGATION_SUPPORTS
Поддерживает текущую транзакцию. Если текущей транзакции нет, она будет выполнена нетранзакционным способом.
PROPAGATION_MANDATORY
Использовать текущую транзакцию, если текущей транзакции нет, выдать исключение.
PROPAGATION_REQUIRES_NEW
Создайте новую транзакцию. Если транзакция в настоящее время существует, приостановите текущую транзакцию.
PROPAGATION_NOT_SUPPORTED
Выполнять операции нетранзакционным способом. Если транзакция в данный момент существует, приостановить текущую транзакцию.
PROPAGATION_NEVER
Выполнять нетранзакционным способом, выдавая исключение, если транзакция в данный момент существует.
PROPAGATION_NESTED
Если транзакция в настоящий момент существует, она выполняется внутри вложенной транзакции. Если текущей транзакции нет, выполните операции, аналогичные PROPAGATION_REQUIRED.
Какую проблему решает полиморфизм?
Полиморфизм означает, что подкласс может заменить родительский класс, и во время фактического процесса выполнения кода вызывается метод подкласса. Полиморфизм также требует, чтобы языки программирования предоставляли для реализации специальные синтаксические механизмы, такие как наследование и классы интерфейса.
Полиморфизм может улучшить масштабируемость и возможность повторного использования кода, а также является основой для реализации в коде многих шаблонов проектирования, принципов проектирования и методов программирования. Например, шаблон стратегии, программирование, основанное на интерфейсах, а не на реализации, принцип инверсии зависимостей, принцип внутренней замены, использование полиморфизма для удаления длинных операторов if-else и т. д.
Является ли HashMap потокобезопасным?
Hashmap не является потокобезопасным. Hashmap будет иметь следующие проблемы в многопоточности:
JDK 1.7 HashMap использоватьмножество + связанный список изданных структур, в контексте многопоточности, существует множество расширений, за исключением существования Entry Цепочка бесконечного цикла иданные потерянные проблемы.
JDK 1.8 HashMap использоватьмножество + связанный список + Красно-черная двоичная древовидная структура, оптимизированная 1.7 План расширения Китая решен Entry Цепочка бесконечного цикла иданные потерянные проблемы. Но в контексте многопоточности поместите Метод сохранения существующих освещений проблемы.
Если вы хотите обеспечить потокобезопасность, вы можете использовать следующие методы:
Многопоточные среды могут использовать Collections.synchronizedMap для синхронизации метода блокировки контроллера.,Вы также можете использовать HashTable,Но да метод синхронизации явно производительность не на должном уровне.,CurrentHashMap больше подходит для высокоскоростных сцен.
Версия ConcurrentHashmapсуществоватьJDK1.7и1.8из сильно изменилась,1.7 Реализовано с использованием метода блокировки сегмента Segment+HashEntry.,1.8 заброшенный сегмент,Вместо этого используйте CAS+synchronized+Node.,Также внесение в красное и черное дерево,избегатьсвязанный Список слишком длинный, что приводит к проблемам с производительностью.
Что такое потокобезопасные коллекции в Java?
В пакете java.util в основном есть два поточно-ориентированных класса, а остальные не являются потокобезопасными.
Vector:Безопасность потоковиздинамических множество, его внутренние методы в основном изменяются с помощью синхронизации, если Безопасность не требуется резьбы выбирать не рекомендуется, ведь синхронизация даст дополнительные накладные расходы из-за. Вектор Внутренне да использует множество объектов для сохранения данных.,Емкость может быть автоматически увеличена по мере необходимости.,Когда много полно,Будет создано новое измножество,И копии оригинала имеют множестводанные.
Hashtable:Безопасность резьбыизHash table, HashTable Метод блокировки заключается в добавлении к каждому методу synchronized ключевое слово, это блокирует весь Table Объект, не поддерживается null Ключ и значение из-за накладных расходов, вызванных синхронизацией, рекомендуется использовать редко, если вы хотите гарантировать, что Безопасность резьбыиз хэш-таблицы можно использовать ConcurrentHashMap.
ConcurrentHashMap:это связано с HashTable изглавное отличиедаобадобавлять Блокировка детализациииздругой,существоватьJDK1.7,Блокировка сегментации ConcurrentHashMapдобавлятьизда,То есть даSegment lock,Каждый сегмент содержит всю таблицу из части,这样другой分段之间изодновременно Операции не влияют друг на друга。существоватьJDK 1.8 , он отменяет поле Segment и напрямую блокирует элемент существующей таблицы с помощью добавления, чтобы реализовать блокировку поставщика для каждой строки, что еще больше снижает вероятность одновременного конфликта. Для операции put, если соответствующий элемент Key имеет значение null, операция CAS (Compare and Swap), чтобы установить текущее значение. Если Key соответствует элементу измножество (т.е. связный заголовок таблицы списка или дерево из корневого элемента) не равно нулю, тогда используйте этот элемент synchronized Ключевое слово применяется для блокировки, а затем выполняет операцию. Если put Операция делает текущий связанный Если длина списка превышает определенный порог, связанный список преобразуется в красно-черное дерево, тем самым повышая эффективность адресации.
ConcurrentSkipListMap:осуществилSkipList(Таблица прыжков)алгоритмиз Сортируемыйизодновременнособирать,SkipListда Структура, которая может выполнять поиск, вставку, удаление и другие операции в течение логарифмического ожидаемого времени.,Эффективный поиск достигается за счет поддержки нескольких ссылок «перехода» на другие элементы.
одновременноSet:
ConcurrentSkipListSet:да Безопасность резьбыизиметь последовательность из коллекции. Базовый да реализуется с использованием ConcurrentSkipListMap.
CopyOnWriteArraySet:да Безопасность резьбыизSetвыполнить,этода Безопасность резьбыиз неупорядоченного набора, что можно понимать как Безопасность резьбыизHashSet。иметьиметь в видуизда,Хотя CopyOnWriteArraySet и HashSet наследуются от общего родительского класса AbstractSet;,HashSetда реализован через «хеш-таблицу» из,А CopyOnWriteArraySet реализуется через «динамическое множество (CopyOnWriteArrayList)».,Не дахэш-таблица.
одновременноList:
CopyOnWriteArrayList:этода ArrayList из Безопасность Вариант резьбыиз, в котором все операции записи (добавление, установка и т. д.) реализуются путем создания новой копии основного множества, что позволяет хранить null элемент. То есть, когда объект выполняет операцию записи,Использовать блокировку блокировки для обработки синхронизации.,Внутренняя копия оригинала,исуществоватьновыймножество Добавить в топдобавлятьдействовать,Наконец, новое число заменяет старое число; если выполняется операция чтения.,затем верните результат напрямую,Во время работы синхронизация не требуется.
одновременно Queue:
ConcurrentLinkedQueue:даодин подходит для высокиходновременносценаизочередь,Он использует безблоковый метод (CAS).,Достигнута одновременно высокая государственная производительность. в целом,ConcurrentLinkedQueue изпроизводительность лучше, чем BlockingQueue 。
BlockingQueue:и ConcurrentLinkedQueue Различные сценарии использования BlockingQueue Основная функция — не улучшение скорости очереди, а упрощение совместного использования несколькими потоками. Блокирующая очередь Обеспечить механизм ожидания блокировки чтения и записи, то есть если потребитель быстрый, то BlockingQueue может быть очищен, и в этот момент потребляющий поток пытается вернуться из BlockingQueue Он будет заблокирован при чтении данных. Напротив, если производственный поток быстрее, то BlockingQueue может быть заполнено, и в этот момент производственный поток пытается BlockingQueue Когда очередь загружена, она будет заблокирована и будет находиться в ожидании.
одновременно Deque:
LinkedBlockingDeque:даодин Безопасность потокииз реализации двусторонней очереди. Он внутренне использует связанный В структуре списка каждый узел поддерживает узел-предшественник и узел-преемник. LinkedBlockingDeque Разделения блокировок чтения и записи нет, поэтому одновременно с ним может работать только один поток.
ConcurrentLinkedDeque:ConcurrentLinkedDequeда Узел связи на основеизнеограниченныйодновременносвязанный список. Безопасно выполнять одновременные действия в разных вариантах.、удалитьи访问действовать。当许多线程同时访问один公共собирать时,ConcurrentLinkedDequeда — подходящий выбор.
Использует ли ConcurrentHashMap пессимистическую или оптимистическую блокировку?
Используются как пессимистическая блокировка, так и оптимистическая блокировка.
При добавлении элементов он сначала определит, пуст ли контейнер:
Если пусто, используйте volatile добавлять CAS (оптимистическая блокировка) инициализировать.
если контейнер не пуст,Тогда в соответствии с хранилищемизэлемент计算该位置да Нет пусто。
Если результат пуст на основе сохраненных элементов, используйте CAS (оптимистическая блокировка) Установите этот узел;
Если результат, рассчитанный на основе сохраненных элементов, не равен нулю, используйте синхронизированный (пессимистическая блокировка) , затем пройдите по сегменту, замените или добавьте узлы в сегмент и, наконец, определите, нужно ли преобразовать да в красно-черное дерево, чтобы обеспечить одновременный доступ из Безопасность резьбы Понятно。
Как реализуется оптимистическая блокировка?
Оптимистическая блокировка предполагает, что конфликты между несколькими транзакциями возникают редко, поэтому она не блокируется при чтении данных. Вместо этого она проверяет версию данных (например, используя номер версии или метку времени) при обновлении данных и выполняет обновление, если версии совпадают, в противном случае считается, что произошел конфликт.
Оптимистическая блокировка подходит для сценариев, в которых выполняется много операций чтения и мало операций записи. Это может снизить конкуренцию блокировок и повысить производительность параллелизма. Например, механизм оптимистической блокировки в базе данных можно использовать для обработки одновременных обновлений одной и той же строки данных.
Оптимистическую блокировку можно реализовать через CAS.
CAS называется CompareAndSwap, который сравнивает и меняет местами. Он в основном использует инструкции процессора для обеспечения атомарности операции. Он содержит три операнда:
Адрес переменной памяти, V представляет
Старое ожидаемое значение, представленное A
Новое значение, которое нужно установить, B представляет
При выполнении инструкции CAS B будет использоваться для обновления значения V только тогда, когда V равно A, в противном случае операция обновления не будет выполнена.
В чем разница между HTTP1.0 и 2.0?
Версия протокола:Http/1.0 Это более ранняя версия, в которой для связи используется текстовый формат. Хотя она поддерживает длинные соединения, по умолчанию она использует короткие соединения. от Начиная с версии http/1.1 по умолчанию используется длинное соединение, HTTP/2.0. Это более новая версия, в которой представлены новые функции, такие как двоичный формат и мультиплексирование.
производительность:Http/1.0 Каждый запрос может отвечать только на один ресурс, для нескольких ресурсов требуется несколько запросов, и существует проблема блокировки начала строки. http/2.0 Поддержка мультиплексирования,Могут передавать несколько запросов и ответов одновременно по одному соединению.,улучшатьпроизводительность。
Сжатие головы:Http/1.0 Каждый запрос и ответ должны содержать полную информацию заголовка, что требует больших накладных расходов. http/2.0 Представлено Сжатие головымеханизм,Уменьшает передачу дублирующейся информации заголовка.,Повышенная эффективность.
push-уведомление сервера:Http/1.0 Вам нужно дождаться запроса клиента, прежде чем отправлять ответ, и вы не можете активно отправлять ресурсы. http/2.0 поддерживатьpush-уведомление сервера,Сервер может передавать связанные ресурсы клиенту до того, как клиент их запросит.,Сократите время ожидания.
Какова функция журнала bin в MySQL?
Binlog — это журнал, реализованный на уровне сервера MySQL и используемый для резервного копирования и восстановления, а также репликации «главный-подчиненный».
Binlog имеет три типа формата: STATEMENT (формат по умолчанию), ROW и MIXED. Различия заключаются в следующем:
ЗАЯВЛЕНИЕ: Данные каждой модификациииз SQL будет записано binlog Средний (эквивалент записи логических операций, поэтому для этого формата binlog Может называться логическим журналом), при репликации master-slave slave на основе SQL Заявление появляется снова. но STATEMENT Возникла проблема с динамическими функциями. Например, если вы используете. uuid или now Эти функции,Результат выполнения в вашей основной существующей библиотеке не является результатом выполнения в вашей существующей ведомой библиотеке.,Существование этой переменной из функции в любой момент времени приведет к несогласованной репликации изданных;
СТРОКА: Во что в конечном итоге были изменены данные строки записи (этот формат из журнала,Его нельзя назвать логическим журналом),не появится STATEMENT Проблема динамических функций. но ROW из Недостатки да Результаты изменения каждой строки данныхиз будут записываться, например, при пакетном выполнении. update оператор, столько строк будет обновлено, сколько записей будет создано, так что binlog Файл слишком велик и находится в STATEMENT Только один будет записан в формате update Просто заявление;
СМЕШАННЫЙ: содержит режимы STATEMENT и ROW, он автоматически использует режим ROW и STATEMENT в зависимости от различных ситуаций;
алгоритм
Бинарное дерево с заданной целью находит максимальную глубину, большую, чем узел в дереве.