java - AtomicReference<V> compareAndSwap是比较对象的地址吗
PHPz
PHPz 2017-04-18 10:40:51
0
2
501
PHPz
PHPz

学习是最好的投资!

répondre à tous(2)
伊谢尔伦

est l'adresse, pour être précis, la valeur de la valeur mémoireLa position Offset de cet objet est comparée à celle attendue
Explication détaillée non sécurisée

.
阿神

Comme l'a dit l'interrogateur, le code source AtomicInteger compare et remplace Integer pour garantir la sécurité des threads. Et AtomicReference est une comparaison et un remplacement par rapport à la référence de l'objet. Ce sont des implémentations CAS de classe atomique.

Quant à savoir s'il faut comparer les adresses, commencez par le AtomicReference mentionné par la personne qui pose la question et connaissez la méthode suivante :

public final boolean compareAndSet(V expect, V update) {
    return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
}

L'implémentation sous-jacente se trouve dans la classe Unsafe, qui est une native méthode locale. Le CAS de Unsafe comprend trois opérandes - l'emplacement mémoire à lire et à écrire valueOffset, la valeur à comparer expected et la nouvelle valeur à écrire update. CAS met à jour atomiquement l'ancienne valeur de l'adresse mémoire avec la nouvelle valeur si et seulement si la valeur stockée dans l'emplacement mémoire V est égale à la valeur comparée A. Sinon, aucune opération n'est effectuée.

La clé réside dans le rôle du valueOffset entrant. Continuez à consulter le code source AtomicReference :

.
static {
  try {
    valueOffset = unsafe.objectFieldOffset
        (AtomicReference.class.getDeclaredField("value"));
  } catch (Exception ex) { throw new Error(ex); }
}

private volatile V value;

Ici, la méthode unsafe de objectFieldOffset consiste à obtenir le décalage mémoire de l'objet, c'est-à-dire qu'en comparant ici, vous pouvez déterminer s'il s'agit de la même adresse d'objet.

Donc, conclusion :

L'opération CAS atomique atomique compare les décalages de mémoire, c'est-à-dire les adresses de mémoire.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal