Рубрики
Без рубрики

Учебное пособие по параллелизму Java – Как избежать взаимоблокировки в Java?

писать параллельные программы сложно, и взаимоблокировка является одной из распространенных проблем. В этой статье вы узнаете, как избежать взаимоблокировки в программе Java, разорвав циклическую зависимость.. С тегами java, программирование, кодирование, разработка.

Раскрытие информации: Этот пост содержит партнерские ссылки; Я могу получить компенсацию, если вы приобретете товары или услуги по различным ссылкам, приведенным в этой статье.

Привет, ребята, вы хотите узнать, как избежать взаимоблокировки при написании параллельных программ, особенно на Java? Написание правильных параллельных приложений никогда не бывает легким, поскольку вам приходится иметь дело с несколькими проблемами параллелизма, такими как условия гонки , блокировка, взаимоблокировка , помехи в памяти и т.д.

В этой статье я расскажу вам как избежать тупика при написании параллельной программы в качестве обсуждения вопросов интервью. Поскольку я разработчик Java, я объясню концепцию и реализацию на Java, но техника, которой я поделюсь с вами, применима для всех видов языков программирования, таких как C++ или C # и т.д.

Вопрос о том, как избежать тупика, является одним из популярных Java interview questions , при этом многопоточность задается в основном на собеседовании старшего уровня с большим количеством последующих вопросов.

Несмотря на то, что вопрос выглядит очень простым, большинство разработчиков Java застревают, как только вы начинаете углубляться.

Итак, что такое тупиковая ситуация? Ответ прост – когда два или более потоков ждут друг от друга освобождения необходимого им ресурса (блокировки) и застревают на бесконечное время, ситуация называется взаимоблокировкой.

Это произойдет только в случае многозадачности или многопоточности , потому что именно здесь в дело вступает несколько потоков.

1. Как обнаружить взаимоблокировку в Java-программах?

Хотя на этот вопрос может быть много ответов, во-первых, я бы посмотрел на код, чтобы увидеть, вызывает ли вложенный синхронизированный блок | синхронизированный метод из другого или он пытается получить блокировку для другого объекта.

Если это так, то существует большая вероятность тупиковой ситуации, если разработчик не будет осторожен.

Другой способ определить риски взаимоблокировки – это когда вы действительно заходите в тупик во время запуска приложения.

Если это произойдет, попробуйте создать дамп потока , в Linux вы можете сделать это с помощью команды “kill -3”. Это выведет статус всех потоков в файле журнала приложения, и вы сможете увидеть, какой поток заблокирован на каком объекте.

Вы можете проанализировать этот дамп потока с помощью таких инструментов, как fastthread.io , который позволяет вам загружать дамп вашего потока и анализировать его.

Другой способ – использовать JConsole/VisualVM . Он покажет вам, какие именно потоки блокируются и на каком объекте.

Если вам интересно узнать об инструментах устранения неполадок и процессе анализа дампа вашего потока, я предлагаю вам взглянуть на это Анализ дампа потоков Java s курс по Pluralsight от Uriah Levy.

Это продвинутый практический курс, позволяющий узнать больше о Java thread dump и ознакомиться с другими популярными расширенными инструментами устранения неполадок.

Кстати, вам потребуется членство в Pluralsight, чтобы получить доступ к этому курсу, который стоит около 29 долларов в месяц или 299 долларов в год (скидка 14%).

Если у вас нет Членство в Pluralsight , я рекомендую вам получить его, потому что оно позволяет вам получить доступ к их более чем 5000 онлайн-курсам по всем последним темам, таким как интерфейсная и серверная разработка, машинное обучение и т.д.

Он также включает в себя интерактивные тесты, упражнения и новейшие сертификационные материалы. Это больше похоже на Netflix для разработчиков программного обеспечения, и поскольку обучение является важной частью нашей работы, членство в Pluralsight – отличный способ оставаться впереди своих конкурентов.

Они также предоставляют 10-дневную бесплатную пробную версию без каких-либо обязательств, что является отличным способом не только получить бесплатный доступ к этому курсу, но и проверить качество курсов, прежде чем присоединиться к Pluralsight.

2. Напишите Java-программу, которая приведет к взаимоблокировке

После того, как вы ответите на предыдущий вопрос, они могут спросить вас, как написать код, который приведет к тупиковой ситуации в Java.

Вот один из способов сделать это:

Многопоточность и параллельные вычисления в Java

Если method1() и method2() оба вызываются двумя или более потоками, существует большая вероятность взаимоблокировки , потому что, если поток 1 получает блокировку строкового объекта во время выполнения method1() и поток 2 получает блокировку для объекта Integer во время выполнения method2() , оба будут ждать друг друга, чтобы снять блокировку для целого числа и строки, чтобы продолжить, что никогда не сработает.

Эта диаграмма эффективно демонстрирует нашу программу, где один поток удерживает блокировку одного объекта и ожидает блокировки другого объекта, который удерживается другим потоком.

Вы можете видеть, что поток 1 хочет заблокировать объект 2, который удерживается Потоком 2, а Поток 2 хочет заблокировать объект 1, который удерживается Потоком 1.

Поскольку ни один поток не желает сдаваться, возникает тупиковая ситуация, и программа Java застревает. Это условие также известно как “Циклическое ожидание без вытеснения”.

Идея состоит в том, что вы должны знать, как правильно использовать общие параллельные шаблоны, и если вы с ними не знакомы, то Применение параллелизма и многопоточности к общим шаблонам Java Хосе Паумарда – хорошая отправная точка для изучения.

3. Как избежать взаимоблокировки в Java

Теперь интервьюер подходит к заключительной части и одному из самых важных вопросов, на мой взгляд: Как исправить тупиковую ситуацию в коде?

Если вы внимательно просмотрели приведенный выше код, то, возможно, поняли, что реальная причина взаимоблокировки заключается не в нескольких потоках, а в том, как они запрашивают блокировку.

Если вы предоставляете заказанный доступ , тогда проблема будет решена.

Вот моя исправленная версия, которая позволяет избежать взаимоблокировки, используя циклическое ожидание без вытеснения . Это одно из четырех условий, необходимых для тупиковой ситуации

Теперь не было бы никакой взаимоблокировки, потому что оба метода обращаются к блокировке литерала класса Integer и String в одном и том же порядке.

Таким образом, если поток A получает блокировку целочисленного объекта, поток B не будет продолжаться до тех пор, пока поток A не снимет целочисленную блокировку.

Это делается таким же образом, поток A не будет заблокирован, даже если поток B удерживает строковую блокировку, потому что теперь поток B не будет ожидать, что поток A снимет целочисленную блокировку, чтобы продолжить работу дальше.

Это все о как избежать тупика при написании параллельных программ . Как я уже говорил, даже обсуждение и пример в Java, метод, которым я поделился, упорядоченный доступ к общему ресурсу не зависит от языка и применим везде.

Формально это известно как прерывание циклического ожидания без условия вытеснения, необходимого для взаимоблокировки, но я просто называю это упорядоченным доступом к общему ресурсу.

Если вы хотите узнать больше о параллелизме, многопоточности и параллельном программировании в целом, вот несколько полезных ресурсов.:

Дальнейшее обучение Многопоточность и параллельные вычисления в Java Параллелизм Java на практике — Книга Применение параллелизма и многопоточности к распространенным шаблонам Java Java Concurrency in Practice Bundle от Heinz Kabutz |/10 Лучшие практики многопоточности и параллелизма Java Топ-50 вопросов о многопоточности и параллелизме в Java Топ-5 курсов по многопоточности и параллелизму для Java-программистов 6 Книг по параллелизму, которые должен прочитать Java-разработчик

Заключительные замечания

Спасибо, что прочитали эту статью до сих пор. Возможно, вы думаете, что это тривиально, но я говорю вам, что это важная концепция, важная как для написания правильных параллельных программ, так и для успешной работы на собеседованиях.

В конце концов, у вас должно быть достаточно знаний и опыта о вещах, упомянутых здесь.

Удачи вам в вашем путешествии по параллельному программированию! Это, конечно, будет нелегко , но, следуя этой дорожной карте и руководству, вы на один шаг ближе к тому, чтобы стать лучшим разработчиком , ты всегда хотел быть

Если вам понравилась эта статья, пожалуйста, подумайте о том, чтобы подписаться на меня в Twitter ( javin paul . если вы хотите получать уведомления о каждом новом сообщении и не забывайте подписываться на javarevisited в Twitter!

P.S.- Если вы хотите изучить Java и многопоточность и ищете несколько бесплатных курсов, пожалуйста, проверьте J ava Multithreading — A #FREE course для начала.

Оригинал: “https://dev.to/javinpaul/java-concurrency-tutorial-how-to-avoid-deadlock-in-java-4aeb”