kotlin: 处理协程并发的同步
一,代码:
//处理按钮点击事件
binding.button1.setOnClickListener {
runBlocking {
var i = 0
val jobs = mutableListOf<Job>()
// 重复一万次,启动一万个协程
repeat(10000){
val job = launch(Dispatchers.Default) {
repeat(10) {
i++
}
}
jobs.add(job)
}
// 等待计算完成
jobs.joinAll()
println("i = $i")
}
}
//处理按钮点击事件
binding.button2.setOnClickListener {
runBlocking {
val mutex = Mutex()
var i = 0
val jobs = mutableListOf<Job>()
// 重复一万次,启动一万个协程
repeat(10000) {
val job = launch(Dispatchers.Default) {
repeat(10) {
// 变化在这里
mutex.withLock {
i++
}
}
}
jobs.add(job)
}
jobs.joinAll()
println("i = $i")
}
}
Mutex.withLock{} 的本质,其实是在 finally{} 当中调用了 unlock()。
使用它的好处就是: 我们就再也不必担心因为异常导致 unlock() 无法执行的问题了
二,运行结果:
第一个按钮:未处理并发时同步
第二个按钮:用mutex处理并发时同步