线程管理 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
我的问题是:
- 是什么原因导致 A 和 D 的行为不同? GlobalScope 是否有更多线程,而 lifecycleScope 是否有单线程?
- B,C,D 的行为相同,但我对 Mutex 的假设是它阻止对线程的访问并且从不调用该函数。所以 synchronized 可以 运行 它以同步的方式。那么mutex和synchronized有什么区别呢?
- lifecycleScope 在某些方面是否与 synchronized 相同?
您问题的答案是:-
lifecycleScope.launch
没有 运行 单独线程中的代码默认情况下它将使用 Main
调度程序,如果你想要它 运行单独的线程你可以传递一个像 lifecycleScope.launch(Dispatchers.IO)
这样的 Dispatcher 另一方面 GlobalScope
将默认使用 Dispatchers.Default
。你可以检查这个只是在 launch
.
中打印线程名称
在这种情况下,Mutex
和 @Synchronized
是相同的,因为您在整个执行过程中都持有互斥锁,只有在线程完成后才会释放它 运行ning它的代码。 @Synchronized
将使方法本身成为 synchronized
,其行为相同。
lifecycleScope
只是一个范围,与 synchronized
无关。
这些是对你问题的较少叙述性的回答,我希望它有意义。您可以通过在 launch
中的日志中打印线程名称来检查这些行为。
请查看 以获得更深入的了解。
我有几个选择:
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 在某些方面是否与 synchronized 相同?
您问题的答案是:-
中打印线程名称lifecycleScope.launch
没有 运行 单独线程中的代码默认情况下它将使用Main
调度程序,如果你想要它 运行单独的线程你可以传递一个像lifecycleScope.launch(Dispatchers.IO)
这样的 Dispatcher 另一方面GlobalScope
将默认使用Dispatchers.Default
。你可以检查这个只是在launch
.在这种情况下,
Mutex
和@Synchronized
是相同的,因为您在整个执行过程中都持有互斥锁,只有在线程完成后才会释放它 运行ning它的代码。@Synchronized
将使方法本身成为synchronized
,其行为相同。lifecycleScope
只是一个范围,与synchronized
无关。
这些是对你问题的较少叙述性的回答,我希望它有意义。您可以通过在 launch
中的日志中打印线程名称来检查这些行为。
请查看