(beachten Sie, dass diese Frage nicht über CAS ist, es geht um die "Kann fälschlicherweise fehlschlagen" Javadoc).Wie kann weakCompareAndSet fälschlicherweise fehlschlagen, wenn es genau wie compareAndSet implementiert wird?
Der einzige Unterschied in der Javadoc zwischen diesen beiden Methoden aus der AtomicInteger
Klasse ist, dass der weakCompareAndSet den Kommentar enthält: „Darf spuriously fail“. Jetzt
es sei denn, meine Augen von einigen Zauber betrogen werden, die beide Methode suchen, um genau tun das gleiche:
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);
}
So merke ich, dass „Mai“ bedeutet nicht „Muss“, aber dann, warum don ‚t wir alle, diese zu unserem Code-Basis zu starten:
public void doIt() {
a();
}
/**
* May fail spuriously
*/
public void weakDoIt() {
a();
}
ich bin wirklich verwirrt mit diesem weakCompareAndSet(), die die gleiche wie die compareAndSet() noch zu tun scheint, dass‚spuriously fehlschlagen‘ während der andere nicht kann.
Anscheinend sind die "schwache" und die "falsche Fehler" in gewisser Weise verwandt mit "passiert vor" Bestellung, aber ich bin immer noch sehr verwirrt durch diese beiden AtomicInteger (und AtomicLong etc.) Methoden: weil sie anscheinend rufen Sie genau das gleiche unsafe.compareAndSwapInt Methode.
Ich bin besonders verwirrt, dass AtomicInteger
in Java 1.5 eingeführt wurde, so dass nach dem Java-Speichermodell ändern (so ist es offensichtlich nicht etwas, das „fail in 1,4 spuriously“ konnte aber dessen Verhalten zu geändert „wird nicht versehentlich in 1,5 ") fehlschlagen.
Gute Frage Wiz –
Weird in der Tat. Es könnte eine zukunftssichere API sein, aber das ist ein seltsamer Weg. Es scheint, dass alle 'AtomicXYZ'-Klassen dasselbe in' compareAndSet' und 'weakCompareAndSet' tun, also ist es auch nicht so, als ob es für Konsistenz zwischen Implementierungen ist. – skaffman
Siehe auch http://stackoverflow.com/questions/4183202/java-compare-and-swap-semantics-and-performance – assylias