Предоставляют ли сопрограммы Kotlin какие-либо гарантии «случится до»?
Например, существует ли гарантия «происходит до» между записью в mutableVar
и последующим чтением в (потенциально) другом потоке в этом случае:
suspend fun doSomething() {
var mutableVar = 0
withContext(Dispatchers.IO) {
mutableVar = 1
}
System.out.println("value: $mutableVar")
}
Редактировать:
Возможно, дополнительный пример прояснит вопрос лучше, потому что он больше похож на Котлин (за исключением изменчивости). Является ли этот код потокобезопасным:
suspend fun doSomething() {
var data = withContext(Dispatchers.IO) {
Data(1)
}
System.out.println("value: ${data.data}")
}
private data class Data(var data: Int)
withContext
, тогда как первый пример сначала создает его, мутирует вwithContext
, а затем читает послеwithContext
. Таким образом, первый пример реализует больше функций безопасности потоков. - person Marko Topolnik   schedule 23.10.2019withContext
просто продолжает выполнять ту же самую сопрограмму в другом контексте). Таким образом, вы не выполняете ничего, кроме согласованности порядка выполнения программы. Теперь есть две проблемы: 1. Гарантируют ли сопрограммы Kotlin согласованность порядка выполнения программы? 2. Поддерживает ли фактическая реализация эту гарантию? Я не уверен, какая из этих двух проблем вызывает у вас подозрения. - person Marko Topolnik   schedule 23.10.2019