Назад к вопросам
Middle+
80
questionbank
Как работает мьютекс в корутинах?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Мьютекс (Mutex) в корутинах предоставляет механизм взаимного исключения для защиты общих ресурсов от одновременного доступа несколькими корутинами.
Принцип работы:
- Захват мьютекса: Корутина, которая хочет получить доступ к защищенному ресурсу, вызывает метод
lock(). - Блокировка: Если мьютекс свободен, корутина неблокирующим образом захватывает его и продолжает выполнение. Если мьютекс занят другой корутиной, вызывающая корутина приостанавливается до тех пор, пока мьютекс не будет освобожден.
- Освобождение мьютекса: После завершения работы с защищенным ресурсом, корутина вызывает метод
unlock(), чтобы освободить мьютекс.
Ключевые особенности в корутинах:
- Неблокирующий
lock()(при захвате свободного мьютекса): В отличие от традиционных потоков, гдеlock()может блокировать весь поток, в корутинах, если мьютекс свободен, захват происходит неблокирующим образом. - Приостановка корутины (при занятом мьютексе): Если мьютекс занят, вызывающая корутина не блокирует поток, а приостанавливается до его освобождения. Это освобождает поток для выполнения других корутин.
- Функция расширения
withLock: Удобный способ использования мьютекса, который автоматически захватывает и освобождает его, даже если внутри блока происходит исключение.
Пример использования:
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
// Критическая секция - защищенный ресурс
counter++
delay(10) // Имитация работы
println("Counter: $counter")
} // Мьютекс автоматически освобождается здесь
}
fun main() = runBlocking {
repeat(100) {
launch {
incrementCounter()
}
}
delay(1000)
}
В этом примере incrementCounter является критической секцией, которая изменяет общий ресурс counter. Мьютекс гарантирует, что только одна корутина одновременно имеет доступ к этой секции, предотвращая состояние гонки. Использование withLock упрощает управление мьютексом.