Taille des primitives java sur 32/64 bit jvm?
- La taille de
int
est 32 bits etlong
/double
sont 64 bits. Ces tailles restent même sur- 32/64 bits JVM
- 32/64 bits des processeurs
- si oui alors que les opérations sur
long
/double
être atomique sur un processeur 64 bits / JVM?
Lectures et écritures sont atomiques pour les variables de référence et pour la plupart des variables primitives (tous les types sauf long et double).
cet énoncé a-t-il quelque chose à voir avec l'architecture JVM/processeur? Quelqu'un peut-il expliquer.
3. Enfin je serai capable de faire lire/écrire de double / long atomique Si j'utilise 64 bits jvm et processeur
5 réponses
Oui, les tailles sont les mêmes sur les JVM 32 et 64 bits. L'assignation n'est pas garantie d'être atomique, que ce soit pour le long ou le double en Java. L'assignation atomique n'est toujours pas une garantie de visibilité à partir d'un autre fil. Parce que les threads sont autorisés à 'shadow' des variables en mémoire, même l'assignation atomique à une variable n'écrit pas nécessairement-à travers la mémoire principale (mais quand la mémoire principale mise à jour, il sera fait automatiquement). Vous toujours utiliser des barrières de synchronisation d'une sorte quelconque lors de l'accès à l'état partagé à partir de deux threads ou plus si vous vous attendez à ce qu'un thread voit des changements constants par l'autre.
le seul type de données qui change de taille est les références. Ceux-ci peuvent être 32-bit ou 64-bit. Il est une idée fausse commune que les références sont 64-bit sur tous les JVM 64-bit et seront là pour utiliser plus de mémoire. Sur Sun / Oracle Java 6 Mise à jour 23 et plus tard, il est devenu la référence par défaut à 32 bits fournir le tas était de moins de 32 Go de taille.
Note: les références 64 bits sont atomiques, indiquant que long
et double
les accès sur ces plateformes pourraient aussi être atomiques. (Mais pas garantie d'être sur tous les systèmes, en particulier JVMs 32 bits)
Selon JLS:
les types intégraux sont byte, short, int, et long, dont les valeurs sont 8-bit, 16-bit, 32-bit et 64-bit signés two ' s-complement entiers, respectivement, et char, dont les valeurs sont 16-bit entier non signé représentant des unités de code UTF-16.
idem pour float et double.
il n'y a aucune mention de 32 bits / 64 bits processeurs / implémentation jvm donc il n'y aura aucune modification vous êtes sur 32 ou 64 bits.
int
est défini comme 32 bits. Cela ne changera pas avec une VM 64 bits vs 32 bits. Même avec
double
est un petit peu délicat. Les spécifications disent que c'est 64 bits de large, donc vous pouvez compter sur au moins ça. Certains VMs peuvent utiliser des nombres plus larges en interne pour faire le calcul réel, mais vous serez très bien si vous traitez toujours un double
comme un nombre de 64 bits (ou si vous spécifiez strictfp
, qui est censé assurer que les nombres sont exactement 64 bits large, ou au moins agir comme si elles sont).
quant à l'atomicité, cela dépend un peu de la plateforme...mais vous serez en sécurité en supposant que lit et écrit à tout ce qui est plus grand qu'un int sont atomique (sauf si la variable est marqué volatile
). Et tout ce qui implique de lire puis d'écrire au même endroit n'est pas atomique pour aucun type. (Ce qui signifie ++a;
n'est pas intrinsèquement atomique.)
les tailles des primitives restent les mêmes. Sur 64 bits processeur / jvm les tailles de tas sont plus grands et le nombre de fils qui peuvent être utilisés augmente.