Модель памяти Java требует, чтобы запись int
была атомарной: то есть, если вы записываете значение (состоящее из 4 байтов) в одном потоке и читаете его в другом, вы получите все байты или ни одного, но никогда 2 новых байта и 2 старых байта или что-то подобное.
Это не гарантируется для long
. Здесь запись 0x1122334455667788
в переменную, содержащую 0
ранее, может привести к тому, что другой поток будет читать 0x112233440000000
или 0x0000000055667788
.
Теперь спецификация не требует, чтобы ссылки на объекты были int или long-size. Из соображений безопасности типов я подозреваю, что они гарантированно записаны атомарно, но на 64-битной ВМ эти ссылки вполне могут быть 64-битными значениями (просто адресами памяти).
Теперь вот мои вопросы:
- Существуют ли какие-либо спецификации моделей памяти, охватывающие это (которые я не нашел)?
- Есть ли подозрения, что при 64-битных виртуальных машинах длинные записи могут быть атомарными?
- Вынуждены ли виртуальные машины отображать ссылки на 32-битные?
С уважением,
Штеффен