Что такое DeadLock

Ответ

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

Пример:

val lock1 = Object()
val lock2 = Object()

Thread {
    synchronized(lock1) {
        Thread.sleep(100)
        synchronized(lock2) { /* DeadLock */ }
    }
}.start()

Thread {
    synchronized(lock2) {
        Thread.sleep(100)
        synchronized(lock1) { /* DeadLock */ }
    }
}.start()

Здесь потоки взаимно блокируют друг друга, так как каждый держит один ресурс и ждёт освобождения другого.

Как избежать:

  • Упорядочивать блокировки (например, всегда сначала lock1, потом lock2).
  • Использовать tryLock с таймаутом.
  • Минимизировать области синхронизации.

Ответ 18+ 🔞

Давай разберём эту штуку, которая у программистов называется DeadLock. Представь себе, блядь, такую картину: два мужика в узком коридоре. Один держит в руках банку пива и хочет взять у второго чипсы, а второй держит пачку чипсов и хочет взять у первого пиво. И оба стоят, упершись лбами, и ждут, пока другой первым разожмёт руки. Вот это и есть DeadLock, ёпта. Полный тупик, зависание навеки вечные.

Вот смотри, как это в коде выглядит, тут всё честно:

val lock1 = Object()
val lock2 = Object()

Thread {
    synchronized(lock1) {
        Thread.sleep(100)
        synchronized(lock2) { /* DeadLock */ }
    }
}.start()

Thread {
    synchronized(lock2) {
        Thread.sleep(100)
        synchronized(lock1) { /* DeadLock */ }
    }
}.start()

Видишь, что тут происходит? Первый поток хватает lock1 и спит чутка. Второй, недолго думая, хватает lock2. Просыпаются оба. Первый пытается схватить lock2, но его уже второй держит. Второй пытается взять lock1, а его первый не отпускает. И всё, приехали. Они так и будут висеть, как два идиота, до скончания времён, или пока кто-то приложение не прибьёт. Волнение ебать просто смотреть на это.

Так как же от этой хуйни избавиться? Есть несколько способов, не такие уж и сложные, главное — головой думать.

  1. Упорядочивай блокировки. Это как в армии: всегда заходишь в дверь в определённом порядке. Договорись с собой, что всегда сначала берёшь lock1, а только потом lock2. Тогда второй поток не полезет за lock2 первым, а будет ждать своей очереди на lock1. Порядок, блядь, он и в Африке порядок.
  2. Используй tryLock с таймаутом. Это как постучаться: «Эй, мужик, отдай чипсы!». Если тебе не открывают в течение, скажем, секунды — пошёл нахуй, не буду я тут ждать. Иди делай что-то другое, а потом вернись и попробуй снова. Не упорствуй, как дурак.
  3. Минимизируй области синхронизации. Это самое важное, чувак. Не хватай всё подряд и не держи долго. Захвати ресурс, сделал своё чёрное дело — сразу отпусти. Э бошка думай: чем меньше кода внутри synchronized-блока, тем меньше шансов, что ты кого-то заблокируешь надолго и сам вляпаешься. Не будь распиздяем, который на весь магазин вешает замок, чтобы купить одну сосиску.

Вот и вся наука. DeadLock — это манда с ушами, но если не тупить и следовать простым правилам, то можно его избежать. А то будет вам хиросима, и приложение накроется медным тазом.

Видео-ответы