测试反馈了个bug,大概意思就是 某种场景下,推送消息会被插入到数据库中两次,而咱们原本的逻辑是 若是没有消息就插入消息,若是有消息 就更新消息的内容便可, 仔细想一想 很快能知道 问题出在 多线程同步这里,同一个方法块 同一个时间点内被执行了,这会致使 判断是否已有消息的条件出现错误,这里的代码是kotlin 协程作的, 因此看下问题怎么解决。数据库
能够看下问题原型:markdown
fun main(){
var counter=0
repeat(100){
GlobalScope.launch {
println(counter++)
}
}
// 防止主线程直接结束
Thread.sleep(100000)
}
复制代码
看下执行结果:多线程
显然这个结果是不可接收的,已经乱了顺序,其实就是简单的线程同步问题,测试
看下kotlin中 怎么解决这个问题spa
fun main(){
var counter=0
var mutex= Mutex()
repeat(100){
GlobalScope.launch {
mutex.withLock {
println(counter++)
}
}
}
// 防止主线程直接结束
Thread.sleep(100000)
}
复制代码
看下结果:线程
问题解决了。3d
再考虑一下另一种场景,以前咱们的mutex 是用在 同一个CoroutineScope中,这里咱们试试看,将Mutex 放到 两个不一样的同一个CoroutineScope中 看看是否还能生效code
fun main(){
var counter=0
var mutex= Mutex()
repeat(100){
GlobalScope.launch {
mutex.withLock {
println(counter++)
}
}
}
repeat(100){
CoroutineScope(Dispatchers.IO).launch{
mutex.withLock {
println(counter++)
}
}
}
// 防止主线程直接结束
Thread.sleep(100000)
}
复制代码
看下执行结果:orm
完美无暇。协程