Java. Чи можливо відсліткувати дедлок? 🫣

Створю найпростіший приклад для відтворення дедлоку.

public class Main {
    public static void main(String[] args) {
        final Object lock1 = new Object();
        final Object lock2 = new Object();
        Thread thread1 = new LockHolder("T1", lock1, lock2);
        Thread thread2 = new LockHolder("T2", lock2, lock1);

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException ignored) {
        }
        System.out.println("Execution complete.");
    }
}

class LockHolder extends Thread {
    private final Object lock1;
    private final Object lock2;

    public LockHolder(String name, Object lock1, Object lock2) {
        setName(name);
        this.lock1 = lock1;
        this.lock2 = lock2;
        start();
    }

    @Override
    public void run() {
        synchronized (lock1) {
            System.out.println("Thread " + getName() + ": Holding resource 1...");
            try {
                Thread.sleep(100); // Introducing a delay to increase the likelihood of deadlock
            } catch (InterruptedException ignored) {
            }
            System.out.println("Thread " + getName() + ": Waiting for resource 2...");
            synchronized (lock2) {
                System.out.println("Thread " + getName() + ": Acquired resource 2!");
            }
        }
    }
}
Після виконання програми

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

Профайлери, такі як VisualVM вміють це виявляти. Давайте подивимось як це виглядає.

Вкладка Threads вже підсвічується червоним.

Deadlock detected!
Take a thread dump to get more info.

Як бачимо, він сам повідомив, що виявив дедлок. Знизу бачимо, що потоки взаємно хотіли отримали локи і заблокувались на відповідних ресурсах. Вони стали заблокованими і не займають процесорний час — програма, в межах цих потоків далі ніяк не просувається.

Якщо зробити дамп потоку, зможемо прочитати наступне

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Oleksandr Klymenko
Oleksandr Klymenko@overpathz

Java Software Engineer

5.1KПрочитань
1Автори
77Читачі
На Друкарні з 19 квітня

Більше від автора

  • Java. jOOQ

    Довгочит буде про jOOQ — бібліотеку, яка зручно поєднує світ Java і SQL. Якщо ви працюєте з базами даних у Java, то, скоріш за все, зустрічались з такими дилемами:

    Теми цього довгочиту:

    Java
  • Secure networking. Deep Dive

    Глибоке занурення в протоколи TLS/SSL та інфраструктуру відкритих ключів (PKI). Основні поняття, процес встановлення захищеного з'єднання, роль сертифікатів та ланцюжка довіри

    Теми цього довгочиту:

    Security
  • Поширені помилки у дизайні REST API

    У довгочиті розглядаються поширені помилки при проектуванні REST API та способи їх уникнення: версіонування, використання DTO, підхід CQRS, робота з мікросервісами, та інші практики для підвищення продуктивності, безпеки й зручності API

    Теми цього довгочиту:

    Java

Вам також сподобається

  • ДЖУНІОР 2023

    Якісь проблеми диктуються ринком, якісь створюються гівняними курсами, або очікуваннями кандидатів.

    Теми цього довгочиту:

    It
  • Які книги з JavaScript слід читати у 2024 році?

    Чому варто вивчати JavaScript у 2024 році? Які книги обрати для вивчення цієї мови програмування? У цій статті ми розглядаємо ключові аргументи на користь вивчення JavaScript у 2024 році та поділимося переліком ресурсів, які допоможуть вам у цьому.

    Теми цього довгочиту:

    Javascript
  • Аспектно орієнтоване програмування в Java

    Стаття про детальний огляд AOP в Java. Weaving: CTW, LTW, RTW. Способи використання. Порівняння інструментів, пояснення анотацій, конфігурування, термінологія.

    Теми цього довгочиту:

    Java

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Вам також сподобається

  • ДЖУНІОР 2023

    Якісь проблеми диктуються ринком, якісь створюються гівняними курсами, або очікуваннями кандидатів.

    Теми цього довгочиту:

    It
  • Які книги з JavaScript слід читати у 2024 році?

    Чому варто вивчати JavaScript у 2024 році? Які книги обрати для вивчення цієї мови програмування? У цій статті ми розглядаємо ключові аргументи на користь вивчення JavaScript у 2024 році та поділимося переліком ресурсів, які допоможуть вам у цьому.

    Теми цього довгочиту:

    Javascript
  • Аспектно орієнтоване програмування в Java

    Стаття про детальний огляд AOP в Java. Weaving: CTW, LTW, RTW. Способи використання. Порівняння інструментів, пояснення анотацій, конфігурування, термінологія.

    Теми цього довгочиту:

    Java