Deadlock (Взаимная блокировка)

Deadlock (взаимная блокировка) — это ситуация, в которой два или более потоков блокируются навсегда, ожидая ресурсы, захваченные друг другом. Это приводит к тому, что ни один из потоков не может продолжить выполнение.

Причины возникновения deadlock

Deadlock обычно происходит в многопоточных программах при неправильном управлении блокировками ресурсов. Основные причины deadlock:

  1. Взаимное исключение (Mutual Exclusion): Ресурсы, необходимые для выполнения задач, могут быть захвачены только одним потоком одновременно.
  2. Удержание и ожидание (Hold and Wait): Поток, удерживающий ресурс, ожидает другого ресурса, захваченного другим потоком.
  3. Отсутствие принудительного освобождения (No Preemption): Ресурсы не могут быть принудительно освобождены другими потоками.
  4. Циклическое ожидание (Circular Wait): Существует цепочка потоков, где каждый поток удерживает ресурс и ожидает ресурс, удерживаемый другим потоком в цепочке.
val lock1 = Any()
val lock2 = Any()

fun main() {
    val thread1 = Thread {
        synchronized(lock1) {
            Thread.sleep(100)
            synchronized(lock2) {
                println("Thread 1")
            }
        }
    }

    val thread2 = Thread {
        synchronized(lock2) {
            Thread.sleep(100)
            synchronized(lock1) {
                println("Thread 2")
            }
        }
    }

    thread1.start()
    thread2.start()
    thread1.join()
    thread2.join()
}