Gibt es einen Unterschied zwischen einer Objektreferenz volatile
und AtomicReference
für den Fall, dass ich nur get()
und set()
-Methoden von verwenden würde AtomicReference
?
java
concurrency
Auramo
quelle
quelle
Nein, da ist kein.
Die zusätzliche Leistung von AtomicReference ist die compareAndSet () -Methode und Freunde. Wenn Sie diese Methoden nicht benötigen, bietet eine flüchtige Referenz dieselbe Semantik wie AtomicReference.set () und .get ().
quelle
Es gibt verschiedene Unterschiede und Kompromisse:
Die Verwendung eines
AtomicReference
get / set hat dieselbe JMM-Semantik wie ein flüchtiges Feld (wie im Javadoc angegeben), aber dasAtomicReference
ist ein Wrapper um eine Referenz, sodass jeder Zugriff auf das Feld eine weitere Zeigerjagd erfordert .Der Speicherbedarf wird multipliziert (unter der Annahme einer komprimierten OOP-Umgebung, was für die meisten VMs gilt):
AtomicReference
= 4b + 16b (12b Objektkopf + 4b Referenzfeld)AtomicReference
bietet eine umfangreichere API als eine flüchtige Referenz. Sie können die API für die flüchtige Referenz mithilfe von aAtomicFieldUpdater
oder mit Java 9 a wiederherstellenVarHandle
. Sie können auch geradeaus greifen,sun.misc.Unsafe
wenn Sie gerne mit einer Schere laufen.AtomicReference
selbst wird mit implementiertUnsafe
.Wann ist es also gut, einen über den anderen zu wählen:
AtomicReference
/AtomicFieldUpdater
/Unsafe
wo Sie dazu neigen, in Bezug auf Lesbarkeit und Risiko für Ihren Leistungsgewinn zu zahlen. Wenn dies kein sensibler Bereich ist, gehen Sie einfach fürAtomicReference
. Bibliotheksschreiber verwenden normalerweise eine Mischung dieser Methoden, abhängig von den Ziel-JDKs, den erwarteten API-Einschränkungen, den Speicherbeschränkungen usw.quelle
JDK-Quellcode ist eine der besten Möglichkeiten, um solche Verwirrungen zu beantworten. Wenn Sie sich den Code in AtomicReference ansehen, wird eine volatie-Variable für die Objektspeicherung verwendet.
Wenn Sie also nur get () und set () für AtomicReference verwenden, ist dies wie die Verwendung einer flüchtigen Variablen. Wie andere Leser kommentierten, bietet AtomicReference zusätzliche CAS-Semantik. Entscheiden Sie also zuerst, ob Sie eine CAS-Semantik wünschen oder nicht, und verwenden Sie AtomicReference nur dann.
quelle
AtomicReference
bietet zusätzliche Funktionen, die eine einfache flüchtige Variable nicht bietet. Wenn Sie die API Javadoc gelesen haben, wissen Sie dies, aber es bietet auch eine Sperre, die für einige Vorgänge nützlich sein kann.Sofern Sie diese zusätzliche Funktionalität nicht benötigen, empfehlen wir Ihnen, ein einfaches
volatile
Feld zu verwenden.quelle
volatile
Feld kann wie jedes reguläre Feld verwendet werden, während für den Zugriff auf den Wert in a Methoden und MethodenAtomicReference
erforderlich sind.get
set
Manchmal ist AtomicReference eine gute Wahl, selbst wenn Sie nur Gets und Sets verwenden:
Beispiel mit flüchtigen Bestandteilen:
Die Implementierung mit AtomicReference bietet Ihnen eine kostenlose Copy-on-Write-Synchronisation.
Man könnte sagen, dass Sie immer noch eine richtige Kopie haben könnten, wenn Sie ersetzen würden:
mit:
Es ist jedoch wahrscheinlicher, dass der zweite in Zukunft versehentlich von jemandem während der "Code-Reinigung" entfernt wird.
quelle