63 lines
1.4 KiB
Kotlin
63 lines
1.4 KiB
Kotlin
import kotlinx.coroutines.Dispatchers
|
|
import kotlinx.coroutines.coroutineScope
|
|
import kotlinx.coroutines.launch
|
|
import kotlinx.coroutines.runBlocking
|
|
import kotlinx.coroutines.sync.Mutex
|
|
import kotlinx.coroutines.sync.withLock
|
|
import kotlinx.coroutines.withContext
|
|
import kotlin.system.measureTimeMillis
|
|
|
|
suspend fun massiveRun(action: suspend () -> Unit) {
|
|
val n = 100 // number of coroutines to launch
|
|
val k = 1000 // times an action is repeated by each coroutine
|
|
val time = measureTimeMillis {
|
|
coroutineScope { // scope for coroutines
|
|
repeat(n) {
|
|
launch {
|
|
repeat(k) { action() }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
println("Completed ${n * k} actions in $time ms")
|
|
}
|
|
|
|
var counter = 0
|
|
|
|
fun withoutMutex() = runBlocking {
|
|
withContext(Dispatchers.Default) {
|
|
massiveRun {
|
|
counter++
|
|
}
|
|
}
|
|
println("Counter = $counter")
|
|
}
|
|
|
|
val mutex = Mutex()
|
|
suspend fun x() {
|
|
mutex.lock() //suspends until mutex is unlocked
|
|
mutex.tryLock() //returns false if mutex is locked
|
|
mutex.unlock() //unlocks mutex
|
|
mutex.withLock {
|
|
|
|
}
|
|
}
|
|
|
|
fun withMutex() = runBlocking {
|
|
withContext(Dispatchers.Default) {
|
|
massiveRun {
|
|
mutex.withLock {
|
|
var c = counter
|
|
c +=1;
|
|
counter = c
|
|
}
|
|
}
|
|
}
|
|
println("Counter = $counter")
|
|
}
|
|
|
|
fun main() {
|
|
withoutMutex()
|
|
//withMutex()
|
|
}
|