Подтвердить что ты не робот

Размер 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 и процессор

4b9b3361

Ответ 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 размеры кучи больше, а число потоков, которые могут быть использованы, растет.