线程管理 Mutex 与 Synchronized

Thread management Mutex vs Synchronized

我有几个选择:

A:

   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

B:

   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

C:

    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

D:

    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 是否有更多线程,而 lifecycleScope 是否有单线程?
  2. B,C,D 的行为相同,但我对 Mutex 的假设是它阻止对线程的访问并且从不调用该函数。所以 synchronized 可以 运行 它以同步的方式。那么mutex和synchronized有什么区别呢?
  3. lifecycleScope 在某些方面是否与 synchronized 相同?

您问题的答案是:-

  1. lifecycleScope.launch 没有 运行 单独线程中的代码默认情况下它将使用 Main 调度程序,如果你想要它 运行单独的线程你可以传递一个像 lifecycleScope.launch(Dispatchers.IO) 这样的 Dispatcher 另一方面 GlobalScope 将默认使用 Dispatchers.Default 。你可以检查这个只是在 launch.

    中打印线程名称
  2. 在这种情况下,Mutex@Synchronized 是相同的,因为您在整个执行过程中都持有互斥锁,只有在线程完成后才会释放它 运行ning它的代码。 @Synchronized 将使方法本身成为 synchronized,其行为相同。

  3. lifecycleScope 只是一个范围,与 synchronized 无关。

这些是对你问题的较少叙述性的回答,我希望它有意义。您可以通过在 launch 中的日志中打印线程名称来检查这些行为。 请查看 以获得更深入的了解。