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

完美無暇。協程

相關文章
相關標籤/搜索