Думаю эта штука дает хороший ответ:
https://kotlinexpertise.com/kotlin-coroutines-guide/#implementationThis whole coroutine stuff is really cool but what about synchronization, how do I share data between different coroutines?
Well, at least that’s what I was asking myself quite early because this seemed to be a reasonable question as most coroutines make use of thread pools (like CommonPool) to be dispatched in. It’s quite evident, that synchronization is just as important as we know it from Java for example. Actually, this is just about right: We can make use of acquainted strategies like using thread-safe data structures, confining execution to a single thread or using locks (see Mutex for further details).
JS Event Loop - штука понятная и простая там по сути один thread и ни каких замарочек с конкурентным доступом и атомарностью.
Корутины полагаются на java threds и похоже что дебаггинг в данном случае сопоставим по сложности с дебагингом привычной многопоточности.