Mutex
Mutex, also known as mutual exclusion, serves as a way to safeguard a shared state that might be accessed by multiple coroutines simultaneously.
Let’s kick off with the familiar scenario we all dread—the counter example. Imagine multiple concurrent tasks attempting to update the same counter:
var counter = 0
val jobs = List(10) {
async(Dispatchers.Default) {
repeat(1000) {
counter++
}
}
}
jobs.awaitAll()
println(counter)
As you might have guessed, the result displayed is less than 10,000, which is quite embarrassing!
To address this issue, we can introduce a locking mechanism that ensures only one coroutine interacts with the variable at any given time, making the operation atomic. Each coroutine tries to obtain ownership of the counter. If another coroutine is already updating it, our coroutine waits patiently and then attempts to acquire the lock again. After updating, it must release the lock to allow other...