Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Kotlin: multithreading, atomicity, volatile

Какие проблемы возникают с 64-битными примитивами (double/long) в многопоточке?

Вопрос раскрывает проблему атомарности операций с 64-битными типами в Java/Kotlin.

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

Чтение/запись long и double не атомарны на некоторых платформах (может читаться частично обновлённое значение). Решение — использование volatile или AtomicLong.

Длинный ответ

1. Суть проблемы

  • На 32-битных системах 64-битные операции (long/double) могут выполняться в два этапа (по 32 бита).

  • Другой поток может увидеть половинчатое значение.

2. Пример риска

var sharedLong = 0L // Не атомарно без volatile!

Thread {
    sharedLong = 0xFFFF_FFFF_FFFF_FFFF // Запись в два этапа
}.start()

Thread {
    println(sharedLong) // Может прочитать 0x0000_FFFF или 0xFFFF_0000
}.start()

3. Решения

  1. volatile
    Гарантирует атомарность чтения/записи:

    @Volatile var sharedLong = 0L
  2. AtomicLong
    Для атомарных операций (инкремент, сравнение):

    val atomicLong = AtomicLong(0)
    atomicLong.incrementAndGet()
  • Аватар

    Android Guru

    Anton Gulyaev

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    2

  • Сложность:

    5

Навыки

  • Kotlin

    Kotlin

  • Android

    Android

Ключевые слова

#multithreading

#atomicity

#volatile

Подпишись на Android Developer в телеграм

  • Аватар

    Android Guru

    Anton Gulyaev

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.