Является написанием эталонного атома на 64-битных виртуальных машинах

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

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

Теперь спецификация не требует, чтобы ссылки на объекты были либо int, либо длинными. По причинам безопасности по типу я подозреваю, что они гарантированно будут записываться атомарно, но на 64-битной VM эти ссылки могут быть очень хорошими 64-битными значениями (просто адресами памяти).

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

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

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

+40
05 апр. '10 в 1:18
источник поделиться
1 ответ

См. Раздел JLS 17.7: Неатомная обработка двойного и длинного

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

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

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

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

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

(добавлен акцент)

+50
05 апр. '10 в 1:36
источник

Посмотрите другие вопросы по меткам или Задайте вопрос