Размер Java примитивов на 32/64 бит JVM? - PullRequest
21 голосов
/ 01 марта 2012
  1. Размер int составляет 32 бита, а long / double - 64 бита. Останутся ли эти размеры одинаковыми на
    1. 32/64-битная JVM
    2. 32/64-битные процессоры
  2. если да, то будут ли операции на long / double атомарными на 64-битном процессоре / JVM?

В руководстве Java 101 по написано :

Чтение и запись являются атомарными для ссылочных переменных и для большинства примитивных переменных (все типы, кроме long и double).

Это утверждение имеет какое-либо отношение к архитектуре jvm / процессора? Может кто-нибудь объяснить, пожалуйста.

3. Наконец я смогу сделать чтение / запись двухъядерным / длинным атомами, если я использую 64-битную JVM и процессор

Ответы [ 5 ]

16 голосов
/ 01 марта 2012

Да, размеры одинаковы как для 32-битной, так и для 64-битной JVM.В Java не гарантируется, что назначение будет атомарным для длинных или двойных значений.Атомное присвоение, все еще не является гарантией видимости из другого потока.Поскольку потокам разрешено «скрывать» переменные в памяти, даже атомарное присвоение переменной не обязательно записывает данные в основную память (но когда основная память обновляется , это будет выполняться атомарно)Вы должны всегда использовать какие-либо барьеры синхронизации при доступе к совместно используемому состоянию из двух или более потоков, если вы ожидаете, что один поток будет последовательно видеть изменения другим.

5 голосов
/ 01 марта 2012

Единственный тип данных, который изменяет размер, это ссылки.Это могут быть 32-битные или 64-битные.Это распространенное заблуждение, что ссылки являются 64-битными на всех 64-битных JVM и будут использоваться для большего объема памяти.В Sun / Oracle Java 6 с обновлением 23 и более поздних версиях по умолчанию стало использоваться 32-разрядная ссылка, если размер кучи был меньше 32 ГБ.

Примечание.* и double доступ на этих платформах также может быть атомарным.(Хотя это не гарантируется для всех систем, особенно для 32-битных JVM)

4 голосов
/ 01 марта 2012

Согласно JLS :
Целочисленными типами являются byte, short, int и long, значения которых составляют 8-разрядные, 16-разрядные, 32-разрядные и 64-разрядные целые числа с двумя дополнительными числами со знаком, соответственно, и char, значения которых равны 16- битовые целые числа без знака, представляющие кодовые единицы UTF-16 .

То же самое касается поплавка и двойника.

Нет упоминания о 32-битных / 64-битных процессорах / реализациях jvm, поэтому не будет никаких изменений, если вы используете 32- или 64-битную версию.

3 голосов
/ 01 марта 2012

int определяется как 32 бита.Это не изменится с 64-битной и 32-битной виртуальной машиной.То же самое с long - это 64 бита, и оно не изменится.

double немного сложнее.Спецификации говорят, что он имеет ширину 64 бита, так что вы можете рассчитывать на это.Некоторые виртуальные машины могут использовать более широкие числа для выполнения математических операций, но вам будет хорошо, если вы всегда будете трактовать double как 64-битное число (или если вы укажете strictfp, что должно гарантировать, что числа в точности 64 бита или, по крайней мере, действуют так, как если бы они были.)

Что касается атомарности, то это в некоторой степени зависит от платформы ... но вы будете в безопасности, предполагая, что читаетзаписи во все, что больше, чем int, не atomic (если переменная не помечена volatile).И все, что включает в себя чтение и запись в одном и том же месте, не является атомарным для любого типа.(Это означает, что ++a; не является атомарным по своей природе.)

2 голосов
/ 01 марта 2012

Размеры примитивов остаются прежними.На 64-битном процессоре / jvm размеры кучи больше, а число потоков, которые можно использовать, растет.

...