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 :
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.
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 remplaceInteger
pour garantir la sécurité des threads. EtAtomicReference
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 :L'implémentation sous-jacente se trouve dans la classe
Unsafe
, qui est unenative
méthode locale. Le CAS deUnsafe
comprend trois opérandes - l'emplacement mémoire à lire et à écrirevalueOffset
, la valeur à comparerexpected
et la nouvelle valeur à écrireupdate
. 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 sourceAtomicReference
:Ici, la méthode
unsafe
deobjectFieldOffset
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 :