fun builder(c: suspend () -> Unit) {} private val lock = Any() suspend fun suspensionPoint() {} private inline fun inlineMe(c: () -> Unit) { synchronized(lock) { c() } } private inline fun monitorInFinally(a: () -> Unit, b: () -> Unit) { try { a() } finally { synchronized(lock) { b() } } } fun test() { builder { synchronized(lock) { suspensionPoint() } } builder { inlineMe { suspensionPoint() } } builder { monitorInFinally( {}, { suspensionPoint() } ) } synchronized(lock) { builder { suspensionPoint() } } synchronized(lock) { object : SuspendRunnable { override suspend fun run() { suspensionPoint() } } } object : SuspendRunnable { override suspend fun run() { synchronized(lock) { suspensionPoint() } } } } interface SuspendRunnable { suspend fun run() }