0

我有几个选择:

   GlobalScope.launch {
        countTo("A",5)
    }
    GlobalScope.launch {
        countTo("B",5)
    }

    
   private fun countTo(from:String, k: Int) {
        for (i in 0 until k) {
            RLog.d("From:$from: $i")
            Thread.sleep(1000)
        }
}

输出:

From:A: 0
From:B: 1
From:A: 1
From:B: 2
From:A: 2
From:B: 3
From:A: 3
From:B: 4
From:A: 4

   GlobalScope.launch {
        countTo("A",5)
    }
    GlobalScope.launch {
        countTo("B",5)
    }

   private val lock = Mutex()
   private suspend fun countTo(from:String, k: Int) {
    lock.withLock {
        for (i in 0 until k) {
            RLog.d("From:$from: $i")
            Thread.sleep(1000)
        }
    }

输出:

From:A: 0
From:A: 1
From:A: 2
From:A: 3
From:A: 4
From:B: 0
From:B: 1
From:B: 2
From:B: 3
From:B: 4

    GlobalScope.launch {
        countTo("A",5)
    }
    GlobalScope.launch {
        countTo("B",5)
    }

    @Synchronized
    private fun countTo(from:String, k: Int) {
        for (i in 0 until k) {
            RLog.d("From:$from: $i")
            Thread.sleep(1000)
        }
     }

输出:

From:A: 0
From:A: 1
From:A: 2
From:A: 3
From:A: 4
From:B: 0
From:B: 1
From:B: 2
From:B: 3
From:B: 4

: _

    lifecycleScope.launch {
        countTo("A",5)
    }
    lifecycleScope.launch {
        countTo("B",5)
    }

    private fun countTo(from:String, k: Int) {
        for (i in 0 until k) {
            RLog.d("From:$from: $i")
            Thread.sleep(1000)
        }
    }

输出:

From:A: 0
From:A: 1
From:A: 2
From:A: 3
From:A: 4
From:B: 0
From:B: 1
From:B: 2
From:B: 3
From:B: 4

我的问题是:

  1. 是什么导致 A 和 D 的行为不同?GlobalScope 是否有更多线程,而生命周期范围是否有单线程?
  2. B,C,D 的行为方式相同,但我对 Mutex 的假设是它阻止对线程的访问并且从不调用该函数。所以 synchronized 可以以同步的方式运行它。那么互斥量与同步有什么不同呢?
  3. 生命周期作用域在某种程度上与同步的作用相同吗?
4

1 回答 1

2

您的问题的答案是:-

  1. lifecycleScope.launch不在单独的线程中运行代码,Main默认情况下它将使用 Dispatcher,如果您希望它在单独的线程中运行,您可以传递一个 Dispatcher,例如lifecycleScope.launch(Dispatchers.IO)On Other hand GlobalScopewill default use Dispatchers.Default。您可以检查这只是打印里面的线程名称launch

  2. 在这种情况下Mutex,并且@Synchronized是相同的,因为您在整个执行过程中都持有 mutext,它只会在线程完成运行其代码后才会被释放。@Synchronized将使方法本身synchronized具有相同的作用。

  3. lifecycleScope只是一个与它无关的范围synchronized

这些是对您的问题的叙述性较少的答案,我希望它有意义。您可以通过在 Log inside 中打印线程名称来检查这些行为launch。请检查这个很好的答案以获得更深入的理解。

于 2021-05-13T12:01:46.837 回答