Исходный Kotlin-код не компилируется: нужен @Volatile, а не модификатор volatile. После исправления на JVM возможны 0/1, 1/0 и 1/1; пара 0/0 исключается.
Возможные результаты вывода в консоль при использовании volatile
Исходный Kotlin-код не компилируется: нужен @Volatile, а не модификатор volatile. После исправления на JVM возможны 0/1, 1/0 и 1/1; пара 0/0 исключается.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какие варианты строк могут появиться в консоли после выполнения приведённого кода.
class State {
volatile var x = 0
volatile var y = 0
}
fun main() {
val state = State()
val t1 = Thread {
state.x = 1
println(state.y)
}
val t2 = Thread {
state.y = 1
println(state.x)
}
t1.start()
t2.start()
t1.join()
t2.join()
}
Ответ
Исходный Kotlin-код не компилируется: нужен @Volatile, а не модификатор volatile. После исправления на JVM возможны 0/1, 1/0 и 1/1; пара 0/0 исключается.
У volatile-записей и чтений есть общий порядок, согласованный с порядком действий каждого потока. Чтобы оба чтения увидели 0, понадобился бы противоречивый цикл в этом порядке. Порядок самих строк println между потоками не фиксирован. При этом @Volatile не делает составные операции вроде x++ атомарными — для них нужна другая синхронизация.
Источник: kotlinlang.org.