Samples of using `synchronized` with coroutines in Kotlin

Synchronized critical method call.

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