tgoop.com/mobileproglib/6292
Create:
Last Update:
Last Update:
Когда несколько корутин обращаются к общим данным или ресурсам одновременно, возникает риск гонок данных (race conditions).
Mutex (mutual exclusion) — это инструмент синхронизации, который помогает управлять доступом к общим ресурсам, гарантируя, что в один момент времени их изменяет только одна корутина.
Вот самые частые примеры, когда Mutex действительно нужен:
Самый распространённый случай — безопасный доступ к общей переменной:
class CounterService {
private var counter = 0
private val mutex = Mutex()
suspend fun increment() {
mutex.withLock {
counter++
}
}
suspend fun getCount(): Int {
return mutex.withLock {
counter
}
}
}
Когда несколько корутин должны поочерёдно работать с общим ресурсом:
class FileWriter(private val file: File) {
private val mutex = Mutex()
suspend fun appendLine(line: String) {
mutex.withLock {
file.appendText("$line\n")
}
}
}
Когда операции должны выполняться строго по порядку, даже если запущены одновременно:
class OrderProcessor {
private val mutex = Mutex()
private val orders = mutableListOf<Order>()
suspend fun processOrder(order: Order) {
mutex.withLock {
// Обеспечиваем последовательную обработку заказов
orders.add(order)
validateOrder(order)
persistOrder(order)
}
}
}
Обеспечивает безопасную инициализацию ресурса в асинхронных контекстах:
class DatabaseConnection {
private var connection: Connection? = null
private val mutex = Mutex()
suspend fun getConnection(): Connection {
if (connection != null) return connection!!
return mutex.withLock {
// Повторная проверка внутри блокировки
connection ?: createConnection().also { connection = it }
}
}
private suspend fun createConnection(): Connection {
delay(1000) // Симуляция установки соединения
return Connection()
}
}
#АрхитектурныйКод #JuniorKit #Kotlin