Tiny project with sample of call critical method in Kotlin from coroutines.
Piece of code:
package com.gitlab.denissov.kcoroutines
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlin.concurrent.thread
fun main(args: Array<String>) {
// threads without synchronization
repeat(3) { id ->
thread {
doAction(id)
}
}
Thread.sleep(1_000)
// threads with synchronization
repeat(3) { id ->
thread {
doSyncAction(id)
}
}
Thread.sleep(1_000)
// coroutines without synchronization
runBlocking {
repeat(3) { id ->
launch {
doSuspendAction(id)
}
}
}
Thread.sleep(1_000)
// coroutines with synchronization
runBlocking {
repeat(3) { id ->
launch {
doSuspendSyncAction(id)
}
}
}
Thread.sleep(1_000)
// coroutines with mutex
runBlocking {
repeat(3) { id ->
launch {
doSuspendMutexAction(id)
}
}
}
}
private fun doAction(id: Int) {
println("doAction Start $id")
Thread.sleep(100)
println("doAction End $id")
}
@Synchronized
private fun doSyncAction(id: Int) {
println("doSyncAction Start $id")
Thread.sleep(100)
println("doSyncAction End $id")
}
private suspend fun doSuspendAction(id: Int) {
println("doSuspendAction Start $id")
delay(100)
println("doSuspendAction End $id")
}
@Synchronized
private suspend fun doSuspendSyncAction(id: Int) {
println("doSuspendSyncAction Start $id")
delay(100)
println("doSuspendSyncAction End $id")
}
val mutex = Mutex()
private suspend fun doSuspendMutexAction(id: Int) = mutex.withLock {
println("doSuspendMutexAction Start $id")
delay(100)
println("doSuspendMutexAction End $id")
}
Result:
doAction Start 0
doAction Start 2
doAction Start 1
doAction End 1
doAction End 0
doAction End 2
doSyncAction Start 0
doSyncAction End 0
doSyncAction Start 2
doSyncAction End 2
doSyncAction Start 1
doSyncAction End 1
doSuspendAction Start 0
doSuspendAction Start 1
doSuspendAction Start 2
doSuspendAction End 0
doSuspendAction End 1
doSuspendAction End 2
doSuspendSyncAction Start 0
doSuspendSyncAction Start 1
doSuspendSyncAction Start 2
doSuspendSyncAction End 0
doSuspendSyncAction End 1
doSuspendSyncAction End 2
doSuspendMutexAction Start 0
doSuspendMutexAction End 0
doSuspendMutexAction Start 1
doSuspendMutexAction End 1
doSuspendMutexAction Start 2
doSuspendMutexAction End 2
Code available at Repository