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...