当前位置:网站首页>kotlin 共享可变状态和并发性

kotlin 共享可变状态和并发性

2022-06-24 12:58:00 day_moon

//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
}
原网站

版权声明
本文为[day_moon]所创,转载请带上原文链接,感谢
https://blog.csdn.net/day_moon/article/details/120110519