Question

J'ai quelques questions au sujet AtomicReference.compareAndSet() la méthode, selon le doc, il dit:

Atomiquement définit la valeur de la donnée mise à jour de la valeur si la valeur actuelle == la valeur attendue.

Comme je le comprends, l' == l'opérateur est de comparer l'adresse de deux objets, si oui, comment ça va marcher dans les exemples de ce genre

private AtomicReference<AccessStatistics> stats =
    new AtomicReference<AccessStatistics>(new AccessStatistics(0, 0));
public void incrementPageCount(boolean wasError) {
    AccessStatistics prev, newValue;
    do {
        prev = stats.get();
        int noPages = prev.getNoPages() + 1;
        int noErrors = prev.getNoErrors;
        if (wasError) {
           noErrors++;
        }
        newValue = new AccessStatistics(noPages, noErrors);
    } while (!stats.compareAndSet(prev, newValue));
}

Dans cet extrait de code, comment la jvm de savoir quels sont les domaines d' AccessStatistics sont à comparer dans le compareAndSet()?En fait, je me demande juste comment est-ce l'ensemble de la stratégie de travail compte tenu de java ne permet pas de remplacer == à tous?Merci pour tous les commentaires!

Était-ce utile?

La solution

comment la jvm de savoir quels champs de AccessStatistics sont à comparer dans le compareAndSet()?

Il n'a pas.Il n'est pas en comparant les champs de l'objet.Il est tout juste en comparant les référence de l'objet, qui est ce que dit la documentation.C'est juste la façon dont le AtomicReference classe fonctionne.Comme vous le mentionnez à partir de la la documentation javadoc, il utilise == et pas la equals() la méthode.

Atomiquement définit la valeur de la donnée mise à jour de la valeur si la valeur actuelle == la valeur attendue.

Tous les Atomic* les classes ont des fonctions similaires.Il permet d'automatiquement défini les valeurs, tout en étant sûr qu'un autre thread n'a pas de remplacer votre valeur.Avec compareAndSet(...) vous devez spécifier le courant de l'objet de référence pour vous assurer de la mise à jour comme prévu.

Dans votre extrait de code, c'est d'essayer d'ajouter un immuable d'accès de l'objet de statistiques.Si elle obtient la valeur actuelle, s'ajoute à ça, et puis les magasins de la nouvelle statistique de la référence.Si un autre thread stockées son les stats entre temps, puis le compareAndSet retourne false et il fait une boucle autour et essaie de nouveau.Cela résout des conditions de course sans avoir à disposer d'un synchronized le bloc.

Autres conseils

La JVM n'est pas de comparer les champs à tous.Il juste compare si oui ou non c'est la même référence, le même pointeur dans la mémoire, ou ce que vous voulez l'appeler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top