предисловие
Я полагаю, что программисты столкнутся с такими проблемами Как устранять взаимоблокировки Java? Как это решить? Итак, что такое тупик? Тупик — это явление, при котором два или более процессов блокируются из-за конкуренции за ресурсы или связи друг с другом во время процесса выполнения. Сегодня я помогу вам решить проблемы, связанные с взаимоблокировкой Java, за один раз.
пример
Суть тупиковой ситуации, например, если в это время есть поток A, он получит блокировку в порядке получения сначала блокировки a, а затем получения блокировки b, в то время как другой поток B получает блокировку в порядке сначала получить блокировку b, а затем получить блокировку a. Как показано ниже:
Затем мы используем код для имитации процесса выполнения онлайн-запроса.
Запустите напрямую и найдите, что основной поток выполняется и не может закончиться
Устранение неполадок, связанных с взаимоблокировкой, с помощью инструментов jdk jps и jstack
Шаг 1: Используйте jsp finder, чтобы сделать это
jps: инструмент, предоставляемый jdk, вы можете просмотреть запущенный процесс Java
Шаг 2: Используйте jstack для просмотра информации о стеке потоков
jstack: инструмент, предоставляемый jdk, позволяет просматривать информацию о стеке потоков в процессе java. Более подробное использование см. в конце документа.
$ jstack 96521
Из приведенной выше информации о стеке мы можем найти это содержимое: «Обнаружен один тупик на уровне Java», что означает, что тупик был обнаружен в программе, и более подробная информация будет включена позже, ключевые моменты следующие:
Код взаимоблокировки находится в строках 32 и 18 файла DeadLock.java.На данный момент мы можем оптимизировать код для решения проблемы взаимоблокировки.
Используйте инструмент jconsole, предоставленный jdk, для устранения неполадок взаимоблокировки.
jconsole: визуальный инструмент, предоставляемый jdk для облегчения устранения неполадок некоторых программных проблем, таких как переполнение памяти программы, проблемы взаимоблокировки и т. д. Более подробное использование см. в конце документа. jconsole находится в каталоге bin jdk
$ jconsole
Вы можете увидеть нашу программу, нажмите подключить.
Просмотр информации о стеке потоков в окне jconsole
Нажмите «Обнаружить взаимоблокировку», вы увидите информацию о взаимоблокировке программы.
Подробная информация о тупике можно увидеть на вышеуказанной рисунке, которая аналогична информации в JStack.
Используйте инструмент VisualVM, предоставляемый jdk, для устранения неполадок взаимоблокировки.
VisualVM: очень мощный инструмент, предоставляемый jdk для устранения проблем с программами Java, он может отслеживать производительность программы, просматривать информацию о конфигурации jvm, снимки кучи и информацию о стеке потоков. Это важный инструмент для оптимизации программы. Инструменты находятся в каталоге bin файла jdk.
$ jvisualvm
Переключитесь в окно потоков
Выполнение намекает, что возникла тупиковая ситуация. Нажмите кнопку «Дамп темы» в окне темы.
Просмотр информации о стеке
Информация моментального снимка стека потоков такая же, как информация, просматриваемая jstack, и можно найти код взаимоблокировки.
Как избежать тупика?
мы знаемКак происходит взаимоблокировка, то вы знаете, как это предотвратить.Если поток может получить только одну блокировку за раз, то нет взаимоблокировки из-за вложенного порядка удержания блокировки..
1. Приобретайте замки в правильном порядке
Если необходимо получить несколько блокировок, нам нужно рассмотреть порядок, в котором различные потоки получают блокировки.
Вышеприведенный пример появляетсяКоренная причина взаимоблокировки заключается в том, что порядок приобретения не соответствует порядку., вне нашего контроля. Идеальной ситуацией для приведенного выше примера является извлечение бизнес-логики,Поместите код для получения блокировки в общедоступный метод и позвольте двум потокам получить блокировку из моего общедоступного метода.
Когда поток Thread1 входит в общедоступный метод, блокировка A получается, и Thread2 входит снова, но блокировка A была получена потоком Thread1, поэтому он может только блокироваться и ждать. Затем Thread1 получает блокировку B, а Thread2 больше не может получить блокировку A, не говоря уже о блокировке B, поэтому существует определенный порядок. Поток B может получить доступ только тогда, когда поток 1 снимет все блокировки.
Например, мы меняем предыдущий пример на
Глядя на результаты печати, мы обнаруживаем, что поток 0 успешно захвачен, а затем поток 1 может продолжить захват.
2. Тайм-аут, чтобы сдаться
Когда поток получает тайм-аут блокировки, он сдается, что позволяет избежать ситуации взаимоблокировки. При использовании встроенной блокировки, предоставляемой ключевым словом synchronized, пока поток не получит блокировку, он будет ждать вечно.Однако интерфейс Lock предоставляет логический метод tryLock (долгое время, единица измерения TimeUnit), выбрасывающий метод InterruptedException., этот метод может ждать блокировки в течение фиксированного периода времени,Таким образом, поток может получить блокировку после тайм-аута., и активно освобождает все ранее полученные блокировки. Таким образом можно очень эффективно избежать тупиковых ситуаций.
Суммировать
Тупик вызван «двумя задачами, конкурирующими за ресурсы в необоснованном порядке», поэтому во избежание взаимоблокировок приложение должно правильно обрабатывать порядок получения ресурсов. В других случаях взаимоблокировка не сразу отражается в приложении,В обычных условиях приложение начинает медленно отображаться после того, как оно какое-то время работало в производственной среде., в реальном процессе тестирования из-за сокрытия тупиковых ситуаций трудно вовремя обнаружить наличие тупиковых ситуаций в процессе тестирования.А в производственной среде,Дедлоки возникают в приложениях, часто когда приложение находится в худшем состоянии — при высокой нагрузке..因此,开发者在开发过程中要谨慎分析每个系统资源的使用情况,合理规避死锁。
Источник: https://mp.weixin.qq.com/s/98KzwNQhBCdVVtPfg9GFXA
Наконец
Расширенные вопросы для собеседования по Java, необходимые для собеседования в 2020 году, суммируют 2 почти 500-страничных документа в формате PDF, добро пожаловать, чтобы обратить внимание на мой общедоступный аккаунт: Завоюйте мир с архитектурой Java, ответьте [2020], чтобы получить эти сопоставленные материалы!
Если вам понравилась статья, не забудьте подписаться на меня и поставить лайк, спасибо за вашу поддержку!