DEV_EASY_NOTES Telegram 38
​​Последняя проблема в списке, но не по значению – DeadLock. DeadLock один из сбоев жизнеспособности. Эта самая популярная проблема многопоточности на практике, которая приносит больше всего проблем. Суть проблемы очень проста, её можно описать небольшим снипетом кода:

val treadList = mutableListOf<Thread>()

treadList += Thread { thread[1].join() }
treadList += Thread { thread[0].join() }

treadList.forEach { it.start() }

☝️Значит есть два потока, которые ждут друг друга, и итоге программа зависает и никуда не продвигается. Пример кода объясняющий суть немного синтетический, на практике DeadLock возникает немного по другой причине. Еще один пример с кодом, погнали:

class LeftRightDeadlock {
private val leftLock = ReentrantLock()
private val rightLock = ReentrantLock()

fun leftRight() {
leftLock.withLock {
rightLock.withLock {
doSomething()
}
}
}

fun rightLeft() {
rightLock.withLock {
leftLock.withLock {
doSomething()
}
}
}
}

🧵 Поток A вызывает метод leftRight(), в этот момент поток B вызывает метод rightLeft(), так как они захватывают замки в разных порядках, оба потока ждут освобождения ресурса, которые не будут освобождены, как на рисунке.

Решил сильно не растягивать пост, этого достаточно для базового понимания того, что такое DeadLock. Помимо причин приведённых в посте есть еще множество способов вызывать DeadLock. Также есть еще различные виды сбоев жизнеспособности которые мы возможно обсудим отдельно. 

И как всегда проблему обозначили, а как её диагностировать и решать обсуждаем отдельно.
👍61



tgoop.com/dev_easy_notes/38
Create:
Last Update:

​​Последняя проблема в списке, но не по значению – DeadLock. DeadLock один из сбоев жизнеспособности. Эта самая популярная проблема многопоточности на практике, которая приносит больше всего проблем. Суть проблемы очень проста, её можно описать небольшим снипетом кода:

val treadList = mutableListOf<Thread>()

treadList += Thread { thread[1].join() }
treadList += Thread { thread[0].join() }

treadList.forEach { it.start() }

☝️Значит есть два потока, которые ждут друг друга, и итоге программа зависает и никуда не продвигается. Пример кода объясняющий суть немного синтетический, на практике DeadLock возникает немного по другой причине. Еще один пример с кодом, погнали:

class LeftRightDeadlock {
private val leftLock = ReentrantLock()
private val rightLock = ReentrantLock()

fun leftRight() {
leftLock.withLock {
rightLock.withLock {
doSomething()
}
}
}

fun rightLeft() {
rightLock.withLock {
leftLock.withLock {
doSomething()
}
}
}
}

🧵 Поток A вызывает метод leftRight(), в этот момент поток B вызывает метод rightLeft(), так как они захватывают замки в разных порядках, оба потока ждут освобождения ресурса, которые не будут освобождены, как на рисунке.

Решил сильно не растягивать пост, этого достаточно для базового понимания того, что такое DeadLock. Помимо причин приведённых в посте есть еще множество способов вызывать DeadLock. Также есть еще различные виды сбоев жизнеспособности которые мы возможно обсудим отдельно. 

И как всегда проблему обозначили, а как её диагностировать и решать обсуждаем отдельно.

BY Dev Easy Notes




Share with your friend now:
tgoop.com/dev_easy_notes/38

View MORE
Open in Telegram


Telegram News

Date: |

ZDNET RECOMMENDS Add up to 50 administrators Telegram channels fall into two types: Telegram is a leading cloud-based instant messages platform. It became popular in recent years for its privacy, speed, voice and video quality, and other unmatched features over its main competitor Whatsapp. End-to-end encryption is an important feature in messaging, as it's the first step in protecting users from surveillance.
from us


Telegram Dev Easy Notes
FROM American