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处理并发时同步

 

posted @ 2025-07-26 11:38  刘宏缔的架构森林  阅读(12)  评论(0)    收藏  举报