AtomicInteger et volatile

Je sais volatile permet de visibilité, AtomicInteger permet l'atomicité.
Donc, si j'utilise un volatile AtomicInteger, ça veut dire je n'ai pas encore utiliser la synchronisation mécanismes?

Par exemple.

class A {

    private volatile AtomicInteger count;

    void someMethod(){
        //do something
        if(count.get() < 10) {
            count.incrementAndGet();
        }
}

Est ce thread-safe?

  • Qu'entendez-vous par "thread-safe" ici? Il n'y a aucune garantie que le code ci-dessus signifie count ne va jamais au-dessus de 10, par exemple - plusieurs threads peuvent appeler intValue(), et puis tous les appels incrementAndGet().
  • Exactement, il en sera de ce travail? if(count.get() <10){ count.incrementAndGet(); } je crois que j'ai encore besoin d'une couche de synchronisation autour, n'est-ce pas?
  • Je ne peux pas donner une réponse sur ce qui va "travailler" jusqu'à ce que vous donnez exigences. Il va compiler? Oui. Seront à éviter toutes les incréments de se perdre? Oui. Il va faire ce que vous voulez? Je ne peux pas dire.
  • Je voulais dire "thread-safe"? Ce sens est-il sécuritaire de la perte de mises à jour?
  • Oui, mais vous pourriez vous retrouver avec un nombre qui est plus grand que 10.
  • Yep, bien comprise, il en aurait encore besoin d'une synchronisé bloc autour AtomicInteger. Merci beaucoup @JonSkeet
  • Pas nécessairement. Cela dépend de vos besoins, que vous n'avez pas encore donné. À l'aide de compareAndSet dans une boucle, vous pouvez vous assurer que vous n'allez jamais au-dessus de 10. Mais je ne vais pas commencer à écrire un exemple de code pour vous aider à résoudre un problème que vous n'avez pas spécifié de façon suffisamment claire.
  • les conditions sont simples. Il doit être thread-safe, maintenant, que voulez-vous dire par là? À mon humble avis, depuis que je suis en train de faire un simple check-puis-loi, il "semble" que je ne veux pas de quelqu'un pour obtenir de count >10 et ce qui se passe dans un multi-thread env.("évidemment") . Merci pour toutes vos réponses, cependant.
  • Non, rien de tout cela est évident. Il y a des situations où il pourrait être bien pour aller au-dessus d'une limite souple, mais pas bien de perdre le nombre de fois que vous avez dépassé cette limite. Compte tenu de vos besoins réels, je vous suggère de vous poser une nouvelle question à ces exigences, laissant celui-ci comme il est.

InformationsquelleAutor Achow | 2013-01-15