【发布时间】:2021-05-13 10:50:15
【问题描述】:
我有几个选择:
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
我的问题是:
- 是什么导致 A 和 D 的行为不同? GlobalScope 是否有更多线程而lifecycleScope 是否有单线程?
- B、C、D 的行为方式相同,但我对 Mutex 的假设是它阻止对线程的访问并且从不调用该函数。所以 synchronized 可以以同步的方式运行它。那么 mutex 与 synchronized 有何不同?
- lifecycleScope 在某些方面与同步的行为相同吗?
【问题讨论】:
标签: android multithreading kotlin global-scope