Друкарня від WE.UA

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 we.ua/overpathz

Java Software Engineer

40Довгочити
8.2KПрочитання
98Підписники
На Друкарні з 19 квітня

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

  • Java Memory Model ↔ PostgreSQL MVCC: один і той самий фундамент конкурентності

    Java Memory Model та PostgreSQL MVCC/Isolation Levels — це дві відповіді на одне й те саме фундаментальне питання: за яких умов зміна, зроблена одним учасником (потоком / транзакцією), стає видимою для іншого?

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

    Java
  • Як виконується SQL-запит

    Сьогодні розберемо, що відбувається з вашим SELECT * FROM users WHERE age > 21 перед тим, як БД поверне вам дані

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

    Computer Science

Це також може зацікавити:

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

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

Це також може зацікавити: