Mutex
Also known as mutual exclusions, mutex provides a means to protect a shared state that can be accessed by multiple coroutines at once.
Let's start with the same old dreaded counter example, where multiple concurrent tasks try to update the same counter:
var counter = 0
val jobs = List(10) {
    async(Dispatchers.Default) {
        repeat(1000) {
            counter++
        }
    }
}
jobs.awaitAll()
println(counter)
As you've probably guessed, the result that is printed is less than 10,000 – totally embarrassing!
To solve this, we can introduce a locking mechanism that will allow only a single coroutine to interact with the variable at once, making the operation atomic.
Each coroutine will try to obtain the ownership of the counter. If another coroutine is updating...