代码之家  ›  专栏  ›  技术社区  ›  Rahul Matte

在Kotlin协同程序中,如何在引擎盖下进行同步?

  •  0
  • Rahul Matte  · 技术社区  · 4 年前

    variableAccessCount 可以从协程C1&访问主线程中的;然而,根据我的理解,协同程序是一段运行在不同线程上的代码,在Android中线程不能被直接触及,有一种机制可以做到这一点,比如处理程序,在协同程序中我们也有 withContext()

    import kotlinx.coroutines.GlobalScope
    import kotlinx.coroutines.delay
    import kotlinx.coroutines.launch
    import kotlin.coroutines.coroutineContext
    
    var variableAccessCount = 0
    
    fun main() {
        println("${Thread.currentThread()}")
    
        GlobalScope.launch {//Coroutine C1
            println("${Thread.currentThread()}")
            firstAccess() }
    
        GlobalScope.launch {//Coroutine C2
            println("${Thread.currentThread()}")
            secondAcess() }
    
        Thread.sleep(2000L)
    
        print("The variable is accessed $variableAccessCount number of times")
    }
    
    suspend fun firstAccess() {
        delay(500L)
        variableAccessCount++
    }
    
    suspend fun secondAcess() {
        delay(1000L)
        variableAccessCount++
    }
    

    有人能帮我理解变量的同步是如何发生的吗 var functionCalls=0

    Thread[main,5,main]
    Thread[DefaultDispatcher-worker-3,5,main]
    Thread[DefaultDispatcher-worker-2,5,main]
    The variable is accessed 2 number of times
    
    0 回复  |  直到 4 年前
        1
  •  0
  •   Petrus Nguyễn Thái Học    4 年前
    • 使用 AtomicInteger :
    val variableAccessCount = AtomicInteger(0)
    
    suspend fun firstAccess() {
        delay(500L)
        variableAccessCount.incrementAndGet()
    }
    
    suspend fun secondAcess() {
        delay(1000L)
        variableAccessCount.incrementAndGet()
    }
    
    val counterContext = newSingleThreadContext("CounterContext")
    var variableAccessCount = 0
    
    suspend fun firstAccess() {
        delay(500L)
        withContext(counterContext) { variableAccessCount++ }
    }
    
    suspend fun secondAcess() {
        delay(1000L)
        withContext(counterContext) { variableAccessCount++ }
    }
    
    val mutex = Mutex()
    var variableAccessCount = 0
    
    suspend fun firstAccess() {
        delay(500L)
        mutex.withLock  { variableAccessCount++ }
    }
    
    suspend fun secondAcess() {
        delay(1000L)
        mutex.withLock  { variableAccessCount++ }
    }