Спецификация Java 11: 17.7. Неатомарная обработка double и long
В рамках модели памяти языка программирования Java одна запись в не-volatile long или double значение рассматривается как две отдельные записи: по одной в каждую 32-битную половину. Это может привести к ситуации, когда поток видит первые 32 бита 64-битного значения при одной записи, а вторые 32 бита - при другой записи. Запись и чтение volatile long и double значений всегда атомарны. Запись и чтение ссылок всегда атомарны, независимо от того, реализованы ли они как 32-битные или 64-битные значения. В некоторых реализациях может оказаться удобным разделить одно действие записи для 64-битного long или double значения на два действия записи для смежных 32-битных значений. Для повышения эффективности это поведение зависит от реализации; реализация виртуальной машины Java может выполнять запись в long и double значения атомарно или в двух частях. Реализациям виртуальной машины Java рекомендуется избегать разделения 64-битных значений, где это возможно. Программистам рекомендуется объявл...