(Notez que cette question ne concerne pas CAS, il s'agit de la "Peut échouer faussement" Javadoc).Comment weakCompareAndSet peut-il échouer faussement s'il est implémenté exactement comme compareAndSet?
La seule différence dans la Javadoc entre ces deux méthodes de la classe AtomicInteger
est que le weakCompareAndSet contient le commentaire: « peut échouer spuriously ».
Maintenant, à moins que mes yeux sont floués par un sort, les deux méthode ne semblent être en train de faire exactement la même chose:
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
/* ...
* May fail spuriously.
*/
public final boolean weakCompareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
Alors je me rends compte que « mai » ne signifie pas « doit », mais alors pourquoi ne « t nous commençons à ajouter ceci à notre base de code:
public void doIt() {
a();
}
/**
* May fail spuriously
*/
public void weakDoIt() {
a();
}
Je suis vraiment confondu avec celui weakCompareAndSet() qui semble faire la même chose que le compareAndSet() encore que « peut échouer spuriously » tandis que l'autre ne le peut pas.
Apparemment, le "faible" et le "faux échec" sont en quelque sorte liés à la commande "arrive avant" mais je suis encore très confus par ces deux méthodes AtomicInteger (et AtomicLong etc.): appelez exactement les mêmes unsafe.compareAndSwapInt méthode.
Je suis particulièrement confus dans cette AtomicInteger
en Java ai été présenté 1.5, après le changement de modèle Java Memory (il est donc évidemment pas quelque chose qui pourrait « fail 1.4 dans spuriously » mais dont le comportement changé « doit pas échouer faussement dans 1.5 ").
Bonne question Wiz –
Bizarre en effet. Il pourrait s'agir d'une vérification de l'avenir de l'API, mais c'est une façon étrange de s'y prendre. Il semble que toutes les classes 'AtomicXYZ' font la même chose dans' compareAndSet' et 'weakCompareAndSet', ce n'est donc pas non plus une question de cohérence entre les implémentations. – skaffman
Voir aussi http://stackoverflow.com/questions/4183202/java-compare-and-swap-semantics-and-performance – assylias