Le choix de ces deux types ne doit pas dépendre de la performance. Le choix principal pour AtomicInteger est, si vous voulez parvenir à la sécurité des threads avec les opérations sur les entiers.
Cependant, la différence de performance peut fortement dépendre de la choisi du système d'exploitation, comme la mise en œuvre des opérations atomiques dépendent du système d'exploitation.
+1. AtomicInteger également fournir un bon mutable entier, même dans un non-simultanées de cas d'utilisation. -1: AtomicInteger existe principalement pour des raisons de performances (à mettre en œuvre sans verrouillage des structures de données). Si thead sécurité étaient le seul souci, vous pouvez simplement utiliser la synchronisation. juste parce que le thread de sécurité est possible avec juste la synchronisation ne signifie pas que AtomicInteger ne fournit pas thread-safe opérations sur entiers. Le point de la réponse est que les performances brutes d'un Entier et AtomicInteger n'est pas ce qui guide le choix de l'un ou de l'autre. Ce qui guide le choix est l'utilisation prévue: avons-nous besoin d'une mutable thread-safe entier, ou avons-nous tout simplement envie de faire du rap d'un nombre entier en un objet immuable? Nizet: la mutabilité n'est pas mentionné dans la réponse. Et sinon, comment pouvez-ci ne soit pas ce qui guide le choix lorsque l'un des choix existe en raison de la performance? La question de l'OP ne mentionne même pas le multi-threading. Il demande juste si il y a une différence de performances entre une Entier et AtomicInteger. AtomicInteger n'a pas été créé pour avoir une plus Entier. Il a été créé pour fournir un "thread-safe", sans verrouillage, mutable Entier. Si vous n'avez pas besoin de la mutabilité et de ne sont pas en cours d'exécution dans un environnement multi-thread, la performance des deux n'a pas d'importance. Vous choisissez le type le plus approprié: Integer. AtomicInteger doit être considérée uniquement si vous avez besoin de la mutabilité (et le fil de sécurité).
Pourquoi ne pas utiliser incrementAndGet? tu veux dire getAndIncrement? Eh bien, bonne question monsieur, je pense que j'ai été trop rapide et paresseux. Non, je veux dire incrementAndGet. getAndIncrement serait l'équivalent de retour i++. Mais votre premier extrait returnn ++i; Euh... yupp, peut-être que je devrait se concentrer uniquement sur mon travail maintenant, merci. Aussi, Brian Goetz sur IBMWorks (nouveau lien) ibm.com/developerworks/library/j-jtp11234/index.html
AtomicInteger permet à certains (pas tous!) les opérations qui seraient autrement nécessitent une synchronisation être effectuée dans une serrure manière sans l'aide de matériel spécifique instructions. Comment cela affecte la performance est un peu complexe:
Tout d'abord, il s'agit d'un micro-optimisation, qui ne fera qu'importe si cette opération est sur votre application de chemin critique.
Le matériel spécial instructions peuvent ne pas être disponibles sur la non-généralisation des plates-formes, dans lequel cas AtomicInteger seront probablement mises en œuvre à l'aide de la synchronisation.
La JVM peut souvent optimiser loin verrouillage lorsqu'il n'existe aucun conflit (par exemple, un seul thread de l'application). Dans ce cas, il n'y a probablement pas de différence.
Si il est faible à modéré de verrouillage (c'est à dire plusieurs threads, mais ils ont surtout faire d'autres choses que le simple accès à ce nombre entier), le lock-free algorithme plus performant que la synchronisation.
Si il est très lourd de verrouillage (c'est à dire beaucoup de fils qui passent beaucoup de temps à essayer d'accéder à ce nombre entier), la synchronisation peut être meilleur parce que le lock-free algorithme est basé sur la permanence de retenter l'opération lorsqu'il échoue en raison d'une collision.
Exactement les types de faits que j'ai été à la recherche pour. Merci.
Suis tombé sur ce poste aujourd'hui mais je voulais partager mes résultats (Svp pas de commentaires sur le code que j'ai eu à main type les classes suivantes, comme le système que j'ai couru ce un n'était pas connecté à l'internet 🙂
Bas de ligne de la sortie à partir du code ci-dessous a été comme suit:
Pour mon utilisation de mon application, j'ai choisi d'utiliser les valeurs Atomiques pour le statut de numéros en un de la surveillance de la classe. Dans le cas où quelqu'un d'autre voulais voir quelques résultats que j'ai choisi de publier cette information.
Ont un grand jour!
Classes:
J'ai créé une classe principale avec une primitive de long et atomique de long et accesseur incrément de méthodes, une IncrementAtomicRunnable et un IncrementPrimitiveRunnable.
Le choix de ces deux types ne doit pas dépendre de la performance. Le choix principal pour
AtomicInteger
est, si vous voulez parvenir à la sécurité des threads avec les opérations sur les entiers.Cependant, la différence de performance peut fortement dépendre de la choisi du système d'exploitation, comme la mise en œuvre des opérations atomiques dépendent du système d'exploitation.
-1: AtomicInteger existe principalement pour des raisons de performances (à mettre en œuvre sans verrouillage des structures de données). Si thead sécurité étaient le seul souci, vous pouvez simplement utiliser la synchronisation.
juste parce que le thread de sécurité est possible avec juste la synchronisation ne signifie pas que AtomicInteger ne fournit pas thread-safe opérations sur entiers. Le point de la réponse est que les performances brutes d'un Entier et AtomicInteger n'est pas ce qui guide le choix de l'un ou de l'autre. Ce qui guide le choix est l'utilisation prévue: avons-nous besoin d'une mutable thread-safe entier, ou avons-nous tout simplement envie de faire du rap d'un nombre entier en un objet immuable?
Nizet: la mutabilité n'est pas mentionné dans la réponse. Et sinon, comment pouvez-ci ne soit pas ce qui guide le choix lorsque l'un des choix existe en raison de la performance?
La question de l'OP ne mentionne même pas le multi-threading. Il demande juste si il y a une différence de performances entre une Entier et AtomicInteger. AtomicInteger n'a pas été créé pour avoir une plus Entier. Il a été créé pour fournir un "thread-safe", sans verrouillage, mutable Entier. Si vous n'avez pas besoin de la mutabilité et de ne sont pas en cours d'exécution dans un environnement multi-thread, la performance des deux n'a pas d'importance. Vous choisissez le type le plus approprié: Integer. AtomicInteger doit être considérée uniquement si vous avez besoin de la mutabilité (et le fil de sécurité).
OriginalL'auteur tune2fs
Bien, si vous l'utilisez en environnement multithread, comme, par exemple, compteur, alors vous avez à
synchronize
l'accès à l'EntierAlors que vous pouvez avoir de bien meilleures performances avec AtomicInteger sans synchronisation
Lecture recommandée http://cephas.net/blog/2006/09/06/atomicinteger/
MODIFIER utilisation incrementAndGet
tu veux dire getAndIncrement? Eh bien, bonne question monsieur, je pense que j'ai été trop rapide et paresseux.
Non, je veux dire incrementAndGet. getAndIncrement serait l'équivalent de retour i++. Mais votre premier extrait returnn ++i;
Euh... yupp, peut-être que je devrait se concentrer uniquement sur mon travail maintenant, merci.
Aussi, Brian Goetz sur IBMWorks (nouveau lien) ibm.com/developerworks/library/j-jtp11234/index.html
OriginalL'auteur bpgergo
AtomicInteger
permet à certains (pas tous!) les opérations qui seraient autrement nécessitent une synchronisation être effectuée dans une serrure manière sans l'aide de matériel spécifique instructions. Comment cela affecte la performance est un peu complexe:AtomicInteger
seront probablement mises en œuvre à l'aide de la synchronisation.OriginalL'auteur Michael Borgwardt
Autre que le très mineur de la surcharge de la synchronisation, no.
OriginalL'auteur Bohemian
Suis tombé sur ce poste aujourd'hui mais je voulais partager mes résultats (Svp pas de commentaires sur le code que j'ai eu à main type les classes suivantes, comme le système que j'ai couru ce un n'était pas connecté à l'internet 🙂
Bas de ligne de la sortie à partir du code ci-dessous a été comme suit:
ATOMIQUE Résultats: Elapsed = 25257 ms, ExpectedValue = 50000, FinalValue = 50000, vrai
PrImItIvE Résultats: Elapsed = 25257 ms, ExpectedValue = 50000, FinalValue = 48991, faux
Pour mon utilisation de mon application, j'ai choisi d'utiliser les valeurs Atomiques pour le statut de numéros en un de la surveillance de la classe. Dans le cas où quelqu'un d'autre voulais voir quelques résultats que j'ai choisi de publier cette information.
Ont un grand jour!
Classes:
J'ai créé une classe principale avec une primitive de long et atomique de long et accesseur incrément de méthodes, une IncrementAtomicRunnable et un IncrementPrimitiveRunnable.
LongOverhead:
IncrementAtomicRunnable:
et enfin
IncrementPrimitiveRunnable:
OriginalL'auteur JavaJd