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

Исходный Kotlin-код не компилируется: нужен @Volatile, а не модификатор volatile. После исправления на JVM возможны 0/1, 1/0 и 1/1; пара 0/0 исключается.

Короткий ответ

Что ответить на собеседовании

Исходный 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.

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

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

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

Подробнее