Размер java-примитивов на 32/64 бит jvm?
- Размер
int
составляет 32 бита, а long
/double
- 64 бита. Будут ли эти размеры оставаться такими же на
- 32/64 бит JVM
- 32-разрядные 64-разрядные процессоры
- Если да, то будут ли операции на
long
/double
атомарными на 64-битном процессоре /JVM?
Учебник по Java Java:
Чтения и записи являются атомарными для ссылочных переменных и для большинства примитивных переменных (все типы, кроме длинного и двойного).
Имеет ли этот оператор какое-либо отношение к архитектуре jvm/processor?
Может кто-нибудь объяснит.
3. Наконец, я смогу сделать чтение/запись двойного/длинного атома, если я использую 64-битный jvm и процессор
Ответы
Ответ 1
Да, размеры одинаковы для 32-битной и 64-разрядной JVM. Назначение не гарантируется как атомарное для long или double в Java. Атомное присвоение, по-прежнему не является гарантией видимости из другого потока. Поскольку потокам разрешено "теневые" переменные в памяти, даже атомарное присваивание переменной необязательно записывается в основную память (но когда основная память обновляется, это будет сделано так атомарно). При доступе к общему состоянию из двух или более потоков вы должны всегда использовать препятствия синхронизации, если вы ожидаете, что один поток будет последовательно видеть изменения другим.
Ответ 2
Единственным типом данных, который изменяет размер, является ссылка. Они могут быть 32-битными или 64-битными. Это распространенное заблуждение, что ссылки являются 64-битными на всех 64-битных JVM, и там будет использоваться больше памяти. В Sun/Oracle Java 6 обновление 23, а затем стало по умолчанию использовать 32-разрядную ссылку, чтобы куча была меньше 32 ГБ.
Примечание. 64-разрядные ссылки являются атомарными, что указывает на то, что обращения long
и double
на этих платформах также могут быть атомарными. (Хотя это не гарантировано для всех систем, 32-разрядные JVM файлы esp)
Ответ 3
В соответствии с JLS:
Интегральные типы - это байты, короткие, int и long, значения которых представляют собой 8-битные, 16-разрядные, 32-битные и 64-разрядные подписанные целые числа с двумя символами, соответственно, и char, значения которых являются 16-разрядными беззнаковые целые числа, представляющие кодовые единицы UTF-16.
То же самое происходит для float и double.
Нет упоминания о 32-битных/64-битных процессорах/реализации jvm, поэтому не будет никаких изменений, если вы на 32 или 64 бит.
Ответ 4
int
определяется как 32 бита. Он не изменится с 64-битной и 32-разрядной виртуальной машиной. То же самое с long
- это 64 бита и не изменится.
double
немного сложнее. Спецификации говорят, что это 64 бита в ширину, так что вы можете рассчитывать хотя бы на это. Некоторые виртуальные машины могут использовать более широкие номера внутри, чтобы выполнять фактическую математику, но вы будете в порядке, если вы всегда относитесь к double
как к 64-битовому номеру (или если вы укажете strictfp
, который должен обеспечивать, чтобы числа были ровно 64 бита в ширину или, по крайней мере, действуют так, как если бы они были).
Что касается атомарности, это в некоторой степени зависит от платформы... но вы будете уверены, что чтение и запись на что-либо большее, чем int, не являются атомарными (если только переменная не отмечена volatile
). И все, что связано с чтением и написанием того же места, не является атомарным для любого типа. (Это означает, что ++a;
не является по сути атомарным.)
Ответ 5
Размеры примитивов остаются неизменными. В 64-битном процессоре /jvm размеры кучи больше, а число потоков, которые могут быть использованы, растет.