Возможные результаты вывода из нескольких потоков

Без синхронизации чтения и записи допустимы пары значений 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее