Вопрос раскрывает проблему атомарности операций с 64-битными типами в Java/Kotlin.
Чтение/запись long и double не атомарны на некоторых платформах (может читаться частично обновлённое значение). Решение — использование volatile или AtomicLong.
На 32-битных системах 64-битные операции (long/double) могут выполняться в два этапа (по 32 бита).
Другой поток может увидеть половинчатое значение.
var sharedLong = 0L // Не атомарно без volatile!
Thread {
sharedLong = 0xFFFF_FFFF_FFFF_FFFF // Запись в два этапа
}.start()
Thread {
println(sharedLong) // Может прочитать 0x0000_FFFF или 0xFFFF_0000
}.start()volatile
Гарантирует атомарность чтения/записи:
@Volatile var sharedLong = 0LAtomicLong
Для атомарных операций (инкремент, сравнение):
val atomicLong = AtomicLong(0)
atomicLong.incrementAndGet()Уровень
Рейтинг:
2
Сложность:
5
Навыки
Kotlin
Android
Ключевые слова
Подпишись на Android Developer в телеграм