Пишет эталонную ссылку на 64-битные виртуальные машины - PullRequest
43 голосов
/ 05 апреля 2010

Модель памяти Java требует, чтобы запись int была атомарной: то есть, если вы записываете значение (состоящее из 4 байтов) в одном потоке и читаете его в другом, вы получите все байты или ни одного, но никогда 2 новых байта и 2 старых байта или что-то подобное.

Это не гарантируется для long. Здесь запись 0x1122334455667788 в переменную, содержащую 0 ранее, может привести к тому, что другой поток будет читать 0x112233440000000 или 0x0000000055667788.

Теперь спецификация не требует, чтобы ссылки на объекты были int или long-size. Из соображений безопасности типов я подозреваю, что они гарантированно записаны атомарно, но на 64-битной ВМ эти ссылки вполне могут быть 64-битными значениями (просто адресами памяти).

Теперь вот мои вопросы:

  • Существуют ли какие-либо спецификации моделей памяти, охватывающие это (которые я не нашел)?
  • Есть ли подозрения, что при 64-битных виртуальных машинах длинные записи могут быть атомарными?
  • Вынуждены ли виртуальные машины отображать ссылки на 32-битные?

С уважением, Штеффен

1 Ответ

54 голосов
/ 05 апреля 2010

См. JLS, раздел 17.7: Неатомарная обработка значений типа double и long

Для целей модели памяти языка программирования Java, одна запись в энергонезависимуюЗначение long или double рассматривается как две отдельные записи: по одной на каждую 32-битную половину.Это может привести к ситуации, когда поток видит первые 32 бита 64-битного значения из одной записи, а вторые 32 бита из другой записи.

Записывает и считывает изменяемые длинные и двойные значения всегдаatomic.

Запись и чтение ссылок всегда являются атомарными, независимо от того, реализованы они как 32-битные или 64-битные значения.

Некоторые реализации могут найтиудобно разделить одно действие записи для 64-разрядного длинного или двойного значения на два действия записи для смежных 32-разрядных значений.Ради эффективности это поведение зависит от реализации;Реализация виртуальной машины Java может выполнять запись в длинные и двойные значения атомарно или из двух частей.

Реализации виртуальной машины Java рекомендуется избегать разбиения 64-битных значений, где это возможно.Программистам рекомендуется объявлять разделяемые 64-битные значения как энергозависимые или правильно синхронизировать свои программы, чтобы избежать возможных осложнений.

(выделение добавлено)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...