Kotlin 协程 Mutex 做用场景

测试反馈了个bug,大概意思就是 某种场景下,推送消息会被插入到数据库中两次,而咱们原本的逻辑是 若是没有消息就插入消息,若是有消息 就更新消息的内容便可, 仔细想一想 很快能知道 问题出在 多线程同步这里,同一个方法块 同一个时间点内被执行了,这会致使 判断是否已有消息的条件出现错误,这里的代码是kotlin 协程作的, 因此看下问题怎么解决。数据库

能够看下问题原型:markdown

fun main(){
    var counter=0
    repeat(100){
        GlobalScope.launch {
            println(counter++)
        }
    }

    // 防止主线程直接结束
    Thread.sleep(100000)
}
复制代码

看下执行结果:多线程

image.png

显然这个结果是不可接收的,已经乱了顺序,其实就是简单的线程同步问题,测试

看下kotlin中 怎么解决这个问题spa

fun main(){
    var counter=0
    var mutex= Mutex()
    repeat(100){
        GlobalScope.launch {
            mutex.withLock {
                println(counter++)
            }
        }
    }

    // 防止主线程直接结束
    Thread.sleep(100000)
}
复制代码

看下结果:线程

image.png

问题解决了。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

image.png

完美无暇。协程

相关文章
相关标签/搜索