Без синхронизации чтения и записи допустимы пары значений 0/0, 0/1, 1/0 и 1/1. Потоки не обязаны увидеть запись друг друга до чтения.
Возможные результаты вывода из нескольких потоков
Без синхронизации чтения и записи допустимы пары значений 0/0, 0/1, 1/0 и 1/1. Потоки не обязаны увидеть запись друг друга до чтения.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какие варианты текста могут появиться в консоли после запуска программы, учитывая работу двух потоков, которые изменяют общие поля объекта.
class State {
var x = 0
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()
}
Ответ
Без синхронизации чтения и записи допустимы пары значений 0/0, 0/1, 1/0 и 1/1. Потоки не обязаны увидеть запись друг друга до чтения.
Обычные поля x и y участвуют в data race. join делает их итоговые значения видимыми вызывающему потоку после завершения, но не упорядочивает чтения внутри t1 и t2. Внутренняя блокировка println не спасает: аргумент state.x или state.y вычисляется до входа в println. Для заданного порядка нужен явный протокол синхронизации; одних запусков Thread недостаточно.
Источник: docs.oracle.com.