tgoop.com/dev_easy_notes/32
Last Update:
Следующая проблема многопоточности Atomicity.
Суть в том, что в платформе, с которой вы работаете, те операции, которые как вам кажется выполняются за одну операцию, на самом деле могут выполняться в несколько операций.
Потому как большинство тут джависты, будем рассуждать на примере платформы JVM (я тупо в других не шарю...)
Начнем с простого примера:
fun main(){
var number: Int = 0
number++
print(number)
}
Взглянем подробнее на операцию number++
– за сколько шагов она делается? В прошлом посте мы уже разобрали, что тут происходит 3️⃣ операции:
📖 считать значение переменной number;
1️⃣ увеличить значение на 1;
✒️ записать новое значение в переменную number.
Все это довольно очевидно и наверняка в головах у вас звучит "Спасибо Кэп 👨✈️", но не спешите меня осуждать. Перейдем к примеру прикольнее:
fun main(){
val number: Long = 0
number = 42
print(number)
}
Смотрим на операцию number = 42
сколько шагов делается тут? Иииии наш любимый ответ хз 🤷♂️, может быть в одну операцию, но может и в две)
"Что за хуефокус❓" – Вопрос, который мог возникнуть в вашей голове и чтобы на него ответить давайте разбираться.
Начнем с того, что это зависит от конкретной JVM и окружения, в которой она выполняется. Как мы знаем программы написанные на языке java можно запускать везде, где есть JVM. Мы пишем на java, а JVM уже умеет работать с конкретной платформой.
И вот тут начинается веселье, в примере мы используем Long. В большинстве языков – Long это целочисленное значение, под которое выделяется 64 бита (для Double кстати тоже).
💻 Процессоры у нас бывают 32х и 64х разрядные. Представим, что JVM работает в системе с 32х разрядным процессором. Вот незадача у нас переменная с размером в 64 бита, а процессор 32х разрядный, как он тогда вообще может записать значение в переменную типа Long? 🤔
Правильно, в 2 этапа, сначала первые 32 бита, затем вторые 32 бита. Смекаете к чему я веду и почему это является проблемой многопоточности? Потому как может быть ситуация, где один поток запишет первые 32 бита, а другой вторые 32 бита. В итоге получим такой баг, который без знания этих основ можно искать очень долго 🔎.
Вот так, как всегда проблема обозначена, а решение я пока попридержу.
BY Dev Easy Notes

Share with your friend now:
tgoop.com/dev_easy_notes/32