我有几个选择:
答:
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
我的问题是:
- 是什么导致 A 和 D 的行为不同?GlobalScope 是否有更多线程,而生命周期范围是否有单线程?
- B,C,D 的行为方式相同,但我对 Mutex 的假设是它阻止对线程的访问并且从不调用该函数。所以 synchronized 可以以同步的方式运行它。那么互斥量与同步有什么不同呢?
- 生命周期作用域在某种程度上与同步的作用相同吗?