測試反饋了個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
完美無暇。協程