//1.并发引发的问题 suspend fun masRun(action:suspend()->Unit){ val a=100 val b=1000 val time= measureTimeMillis { coroutineScope { repeat(a){ launch { repeat(b){action()} } } } } println("actions: ${a * b} , 时间 $time ")//actions 100000 时间 49-80ms } @Volatile//Volatiles 是没有作用的 var count=0 fun main_masRun() = runBlocking { withContext(Dispatchers.Default){ masRun{ count++ } } println("总数 = $count")//68147 counter而不进行任何同步 } //2.线程安全的数据结构解决并发问题 suspend fun masVolatile (action:suspend()->Unit){ val a=100 val b=1000 val time= measureTimeMillis { coroutineScope { repeat(a){ launch { repeat(b){action()} } } } } println("actions: ${a * b} , 时间 $time ")//actions 100000 时间 52 } var counts=AtomicInteger()//Volatiles 是没有作用的 fun main_volatile () = runBlocking { withContext(Dispatchers.Default){ masVolatile{ counts.incrementAndGet()//之前是++ } } println("总数 = $counts")//100000 } //3.以细粒度限制线程 val counterContext= newSingleThreadContext("counterContext") fun main_countercontext() = runBlocking { withContext(Dispatchers.Default){ masVolatile{ withContext(counterContext){//每个单独的增值操作都使用 withContext(counterContext) count++ } } } println("总数 = $count")//100000 } //4.以粗粒度限制线程 val counterContexts= newSingleThreadContext("counterContext") fun main_countercontexts() = runBlocking { withContext(counterContexts){//线程限制是在比较大的范围内执行的 masVolatile{ count++ } } println("总数 = $count")//100000 4152 } //5.互斥 val mutex= Mutex() fun main_mutex() = runBlocking { withContext(Dispatchers.Default){//线程限制是在比较大的范围内执行的 masVolatile{ mutex.withLock {//加锁 细粒度的 count++ } } } println("总数 = $count")//100000 4152 } //6.Actors sealed class CounterMsg object IncCounter : CounterMsg()//增加的对象 class GetCounter(val response: CompletableDeferred<Int>) : CounterMsg()//请求的回应 fun CoroutineScope.counterActor() = actor<CounterMsg> { var counter = 0 // actor状态 for (msg in channel) { // iterate over incoming messages when (msg) { is IncCounter -> counter++ is GetCounter -> msg.response.complete(counter) } } } fun main_actor() = runBlocking<Unit> { val counter = counterActor() //增加一个actor withContext(Dispatchers.Default) { masVolatile { counter.send(IncCounter) } } //从actor得到发送来的值 val response = CompletableDeferred<Int>() counter.send(GetCounter(response)) println("Counter = ${response.await()}") counter.close() //关闭actor }
kotlin 共享可变状态和并发性
最新推荐文章于 2024-05-09 15:07:48 发布