Ответ
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, а его первый не отпускает. И всё, приехали. Они так и будут висеть, как два идиота, до скончания времён, или пока кто-то приложение не прибьёт. Волнение ебать просто смотреть на это.
Так как же от этой хуйни избавиться? Есть несколько способов, не такие уж и сложные, главное — головой думать.
- Упорядочивай блокировки. Это как в армии: всегда заходишь в дверь в определённом порядке. Договорись с собой, что всегда сначала берёшь
lock1, а только потомlock2. Тогда второй поток не полезет заlock2первым, а будет ждать своей очереди наlock1. Порядок, блядь, он и в Африке порядок. - Используй
tryLockс таймаутом. Это как постучаться: «Эй, мужик, отдай чипсы!». Если тебе не открывают в течение, скажем, секунды — пошёл нахуй, не буду я тут ждать. Иди делай что-то другое, а потом вернись и попробуй снова. Не упорствуй, как дурак. - Минимизируй области синхронизации. Это самое важное, чувак. Не хватай всё подряд и не держи долго. Захвати ресурс, сделал своё чёрное дело — сразу отпусти. Э бошка думай: чем меньше кода внутри
synchronized-блока, тем меньше шансов, что ты кого-то заблокируешь надолго и сам вляпаешься. Не будь распиздяем, который на весь магазин вешает замок, чтобы купить одну сосиску.
Вот и вся наука. DeadLock — это манда с ушами, но если не тупить и следовать простым правилам, то можно его избежать. А то будет вам хиросима, и приложение накроется медным тазом.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶