Настоящим я записываю некоторые вопросы интервью, которые я испытал и задумал. Если есть какие-либо вопросы по ответам, пожалуйста, не стесняйтесь обсуждать их. Я надеюсь, что это может быть полезно для студентов, которые ищут работу или заинтересованы.
1. Сходства и различия между синхронизированной и реентерабельной блокировкой
Та же точка
- Оба реализуют многопоточную синхронизацию и семантику видимости памяти.
- повторная блокировка
разница
- Механизм реализации другой Синхронизация реализована через метку блокировки заголовка объекта java и объект Monitor reentrantlock реализован через CAS, AQS (AbstractQueuedSynchronizer) и поддержку блокировки (для блокировки и разблокировки) Synchronized опирается на модель памяти JVM для обеспечения видимости многопоточной памяти, включая общие переменные. reentrantlock гарантирует видимость многопоточной памяти, включая общие переменные, через изменчивое состояние ASQ.
- Используйте по-разному синхронизированный может изменять методы экземпляра (объекты экземпляра блокировки), статические методы (объекты класса блокировки), блоки кода (отображать указанные объекты блокировки) reentrantlock показывает, что вызывается метод trylock()/lock() и блокировку необходимо снять в блоке finally
- богатство функций reentrantlock обеспечивает богатую семантику, такую как ограниченное время ожидания блокировки (установить срок действия), прерываемые блокировки (lockInterruptably), условие (предоставление таких методов, как ожидание, сигнал и т. д.) reentrantlock обеспечивает справедливую и нечестную блокировку. Синхронизированный не может установить время ожидания, не может быть прерван (прерван)
2. Почему concurrenthashmap читается без блокировки
- jdk1.7
1) Ключ, хэш и следующий в HashEntry являются окончательными, и только заголовок может быть вставлен или удален.
2) Поле значения класса HashEntry объявлено как volatile
3) Не допускается использование null в качестве ключа и значения.Когда читающий поток считывает значение поля value HashEntry как null, он знает, что произошел конфликт - произошло явление переупорядочивания (put устанавливает байт-код объекта нового значения Переупорядочивание инструкций), вам необходимо перечитать это значение после блокировки
4) Волатильная переменная count координирует видимость памяти между потоками чтения и записи.После операции записи счетчик изменяется.Операция чтения сначала считывает счетчик.Согласно принципу транзитивности "происходит до транзитивности", модификация операции записи и можно увидеть операцию чтения. - jdk1.8
1) Node's val и next оба изменчивы
2) Небезопасные операции, соответствующие tabAt и casTabAt, реализуют изменчивую семантику.
3. Роль ContextClassLoader (загрузчик класса контекста потока)
- Переопределить родительский механизм делегирования загрузчика классов для загрузки классов, таких как реализация загрузчика служб.
- Используйте загрузчик класса контекста потока для загрузки классов, обратите внимание на то, чтобы загрузчик классов между несколькими потоками, которые должны взаимодействовать, был одним и тем же, чтобы предотвратить исключения преобразования типа (ClassCastException), вызванные разными загрузчиками классов.
4. Механизм загрузки класса Tomcat
- Разные приложения используют разные загрузчики классов веб-приложений для достижения эффекта изоляции приложений.Под загрузчиком классов веб-приложений находится загрузчик классов jsp.
- Пакеты jar, совместно используемые разными приложениями, могут быть помещены в общий каталог загрузчика классов/общий.
5. механизм загрузки класса osgi
- Модель загрузки классов osgi является ячеистой и может делегировать друг другу функции между модулями (пакетами).
- Ключом к реализации osgi модульного горячего развертывания является реализация механизма пользовательского загрузчика классов.Каждый пакет имеет свой собственный загрузчик классов.Когда пакет необходимо заменить, пакет и загрузчик классов заменяются вместе для реализации кода.горячий замена
- Когда получен запрос на загрузку класса, osgi выполнит поиск класса в следующем порядке:
1) Делегировать классы, начинающиеся с java.*, в загрузчик родительского класса для загрузки
2) В противном случае делегируйте классы в списке делегирования (определенном в файле конфигурации org.osgi.framework.bootdelegation) загрузчику родительского класса для загрузки
3) В противном случае проверьте, объявлен ли он в Import-Package, если да, делегируйте загрузчику классов Bundle класса Export для загрузки
4) В противном случае проверьте, объявлен ли он в Require-Bundle, если да, делегируйте запрос на загрузку класса загрузчику классов требуемого пакета.
5) В противном случае найдите ClassPath текущего Bundle и загрузите его с помощью собственного загрузчика классов.
6) В противном случае узнайте, находится ли класс в своем собственном пакете фрагментов, и если да, делегируйте загрузчику классов пакета фрагментов для загрузки
7) В противном случае найдите пакет динамического импорта-пакета (динамический импорт будет загружаться только тогда, когда пакет фактически используется) и делегируйте загрузку загрузчику классов соответствующего пакета.
8) В противном случае поиск класса завершится неудачно.
6. Сходства и различия между сном и ожиданием
- ожидание необходимо использовать в сочетании с синхронизированным, и полученная синхронизированная блокировка будет снята при ожидании.
- sleep будет передавать только процессор, а не блокировку
- Оба могут быть прерваны
7. Как завершить поток, который выполнялся все время
- Используйте флаг выхода, переменная флага должна быть видна нескольким потокам.
- Использовать прерывание в сочетании с isInterrupted()
8. Сценарии и проблемы использования Threadlocal
- Threadlocal не решает проблему многопоточных общих переменных, объекты, содержащиеся в одном threadlocal, имеют разные копии в разных потоках и не мешают друг другу.
- Используется для хранения переменных контекста потока, что удобно для того, чтобы один и тот же поток считывал переменные до и после несколько раз, например, транзакции, подключения к базе данных и многое другое, используемое в веб-программировании.
- проблема:Обратите внимание, что сценарий пула потоков использует threadlocal, поскольку фактическое значение переменной хранится в переменной типа threadlocalmap потока.Если значение не будет удалено или установлено первым, может быть получено предыдущее старое значение.
- проблема:Обратите внимание на утечку памяти в сценарии пула потоков, хотя get/set threadlocal очистит ключ (ключ является слабой ссылкой на threadlocal, а значение является сильной ссылкой, что приводит к тому, что значение не будет освобождено) запись, которая является нулевой, лучше удалить запись.
9. Поток пула потоков от запуска до работы
- Когда только что создан, в нем нет потоков
- При вызове execute() для добавления задачи:
1) Если количество запущенных потоков меньше, чем параметр ядра corePoolSize, продолжайте создавать потоки для запуска задачи
2) В противном случае, если количество запущенных потоков больше или равно corePoolSize, добавить задачу в очередь блокировки
3) В противном случае, если очередь заполнена и количество запущенных потоков меньше, чем параметр ядра maxPoolSize, продолжать создавать потоки для выполнения задачи
4) В противном случае, если очередь заполнена и количество одновременно запущенных потоков больше или равно maxPoolSize, она будет обработана в соответствии с установленной политикой отклонения.
5) Завершить задачу и продолжить снимать следующую задачу для обработки
6) Никакие задачи не продолжают обрабатываться, поток прерывается или пул потоков закрывается, поток завершает выполнение, если пул потоков закрывается, поток завершается
7) В противном случае оцените, больше ли количество потоков, работающих в пуле потоков, чем количество основных потоков, если да, то поток завершается, иначе поток блокируется. Следовательно, после выполнения всех задач пула потоков размер пула потоков, который продолжает оставаться, равен corePoolSize.
10. Разница между взятием BlockingQueue и опросом
- poll(time): взять первый объект в BlockingQueue. Если вы не можете удалить его немедленно, вы можете подождать время, указанное параметром времени, и вернуть null, если вы не можете его удалить.
- take(): взять первый объект в BlockingQueue. Если BlockingQueue пуст, блокировать до тех пор, пока в BlockingQueue не будет добавлен новый объект.
Как получить результат от FutureTask без блокировки
- получить (длительный тайм-аут, блок TimeUnit), вернуть, если тайм-аут
- Опрос, сначала оцените, закончился ли он с помощью isDone(), а затем вызовите get()
12. Если в очереди на блокировку хранится больше важных данных, что делать с простоем системы
- Открытый вопрос, добро пожаловать на обсуждение
- Сохранять очередь проблематично. Производственные данные должны быть сохранены на диске, и сохраняемость вернется после успеха. Поток-потребитель загружает данные с диска в очередь блокировки памяти, поддерживает смещение потребления и загружает данные с диска по смещению расхода при запуске.
- Присоединяйтесь к очереди сообщений, чтобы гарантировать, что сообщения не будут потеряны, генерируйте серийные номера, используйте идемпотент и определяйте статус производства после перезапуска системы в соответствии с процессом потребления.
13. Разница между NIO и традиционным вводом-выводом
- Чтобы сохранить потоки, NIO изменился с первоначальной необходимости блокировать чтение и запись для каждого потока на один поток (т.е. селектор), отвечающий за обработку коллекций интересующих событий регистрации нескольких каналов (SelectionKey) (нижний уровень использует предоставленную функцию epoll()). операционной системой. )) группа netty bossgroup обрабатывает прием соединений (Я не понимаю, почему для группы боссов необходимо настраивать несколько потоков.Добавлено: Говорят, что это для сценария, когда несколько загрузчиков совместно используют группу боссов.), рабочая группа обрабатывает определенные бизнес-процессы, а также чтение и запись данных.
- NIO обеспечивает неблокирующие операции
- Традиционный ввод/вывод обрабатывает данные в потоке, тогда как NIO обрабатывает данные блоками.NIO предоставляет байтовый буфер, который делится на буферы в куче и вне кучи.При чтении и записи они сначала помещаются в буфер, а затем передаются ядром.Канал передается пиру, а буфер вне кучи не уходит в ядро, что повышает производительность
14. Повторяющиеся строки хранятся в списке, как удалить строку
- Вызов методов, связанных с итератором, для удаления
- Удаление в обратном направлении, чтобы предотвратить перестройку массива, вызванную удалением в положительном порядке, индекс пропускает проблему элементов массива.
15. Что такое GC ROOTS (относящиеся к ежедневной разработке, связанная с этим утечка памяти)
- Текущие активные кадры стека всех потоков Java указывают на ссылки на объекты в куче сборщика мусора, поэтому неиспользуемые объекты вовремя обнуляются для повышения эффективности восстановления памяти.
- Объекты, на которые ссылаются статические переменные, поэтому уменьшите размер статических переменных, особенно статических переменных коллекций, и объекты, хранящиеся в коллекциях, переопределяют euqls() и hashcode(), чтобы предотвратить непрерывный рост.
- Объект, на который ссылается собственный метод JNI
- Объекты, на которые ссылаются константы в области методов, например, в версиях до JDK7, стараются свести к минимуму вызов String.intern() для длинных строк.
- Объект класса, загруженный загрузчиком классов, поэтому, когда пользовательский загрузчик классов недействителен, вовремя установите значение null и обратите внимание на изоляцию между объектами, загружаемыми загрузчиком классов.
- Ссылки на объекты в куче GC в некоторых статических структурах данных в jvm
- ...
16. Роль летучих
17. Особенности распространения транзакций Spring
Общие вопросы, пожалуйста, ищите в Интернете
18. Каковы qos любого mq (например, kafka) и как они гарантируются?
Обычно есть:
- не более одного раза: не более одного раза
- по крайней мере один раз: по крайней мере один раз
- ровно один раз: есть и только один раз Пожалуйста, поищите принцип реализации, будь то ровно один раз, вам нужно быть идемпотентом.
19. Как создать похожую функцию, похожую на Weibo (параллелизм с высоким трафиком)
открытые вопросы, пожалуйста, ищите
20. Служба отвечает медленно, как решить проблему
То же
21. Расскажите о средствах оптимизации sql
То же
22. Поделитесь опытом разделения микросервисов
То же
Продолжение следует (java, алгоритм, spring, redis, dubbo, kafka, zookeeper и т.д.)