Что поток сделает с объектом, если не будет Volatile

«Что поток сделает с объектом, если не будет Volatile» — вопрос из категории Многопоточность, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Без volatile другой поток может не увидеть изменения переменной из-за кеширования в регистрах процессора или локальной памяти потока. Это может привести к проблемам с видимостью изменений между потоками.

Пример:

var flag = false // без volatile

fun thread1() {
    while (!flag) { /* может зациклиться */ }
    println("Flag changed!")
}

fun thread2() {
    Thread.sleep(1000)
    flag = true
}

Здесь thread1 может никогда не увидеть изменение flag, сделанное в thread2. Добавление @Volatile гарантирует, что изменения будут видны всем потокам сразу.