Код, который вы написали, имеет три доступа к общему состоянию:
var mutableVar = 0 // access 1, init
withContext(Dispatchers.IO) {
mutableVar = 1 // access 2, write
}
System.out.println("value: $mutableVar") // access 3, read
Три доступа строго упорядочены последовательно, без параллелизма между ними, и вы можете быть уверены, что инфраструктура Kotlin позаботится о создании случается до край при передаче в пул потоков IO
и обратно к вызывающей сопрограмме.
Вот эквивалентный пример, который может показаться более убедительным:
launch(Dispatchers.Default) {
var mutableVar = 0 // 1
delay(1)
mutableVar = 1 // 2
delay(1)
println("value: $mutableVar") // 3
}
Поскольку delay
является приостанавливаемой функцией, и поскольку мы используем диспетчер Default
, который поддерживается пулом потоков, строки 1, 2 и 3 могут выполняться в каждом потоке. Поэтому ваш вопрос о гарантиях произойдет до в равной степени относится к этому примеру. С другой стороны, в этом случае (я надеюсь) совершенно очевидно, что поведение этого кода соответствует принципам последовательного выполнения.