Apakah ada perbedaan antara volatile
referensi Obyek dan AtomicReference
jika saya hanya akan menggunakan get()
dan set()
-metode dari AtomicReference
?
java
concurrency
auramo
sumber
sumber
Tidak, tidak ada.
Kekuatan tambahan yang disediakan oleh AtomicReference adalah metode compareAndSet () dan teman-teman. Jika Anda tidak memerlukan metode itu, referensi yang mudah menguap menyediakan semantik yang sama dengan AtomicReference.set () dan .get ().
sumber
Ada beberapa perbedaan dan pengorbanan:
Menggunakan
AtomicReference
get / set memiliki semantik JMM yang sama dengan bidang volatil (seperti status javadoc), tetapiAtomicReference
pembungkus di sekitar referensi, sehingga setiap akses ke bidang melibatkan pengejaran penunjuk lebih lanjut .The jejak memori dikalikan (dengan asumsi lingkungan OOP dikompresi, yang berlaku untuk sebagian besar VMS):
AtomicReference
= 4b + 16b (header objek 12b + bidang ref 4b)AtomicReference
menawarkan API yang lebih kaya daripada referensi yang tidak stabil. Anda bisa mendapatkan kembali API untuk referensi yang mudah menguap dengan menggunakanAtomicFieldUpdater
, atau dengan Java 9 aVarHandle
. Anda juga bisa meraih lurussun.misc.Unsafe
jika Anda suka berlari dengan gunting.AtomicReference
itu sendiri diimplementasikan menggunakanUnsafe
.Jadi, kapan sebaiknya memilih satu di antara yang lain:
AtomicReference
/AtomicFieldUpdater
/ diUnsafe
mana Anda cenderung membayar dalam keterbacaan dan risiko untuk kenaikan kinerja Anda. Jika ini bukan area sensitif hanya untukAtomicReference
. Penulis perpustakaan biasanya menggunakan campuran metode ini tergantung pada JDK yang ditargetkan, pembatasan API yang diharapkan, kendala memori dan sebagainya.sumber
Kode sumber JDK adalah salah satu cara terbaik untuk menjawab kebingungan seperti ini. Jika Anda melihat kode di AtomicReference, ia menggunakan variabel volatie untuk penyimpanan objek.
Jadi, jelas jika Anda hanya akan menggunakan get () dan set () pada AtomicReference itu seperti menggunakan variabel volatile. Tetapi seperti komentar pembaca lain, AtomicReference menyediakan semantik CAS tambahan. Jadi, pertama-tama putuskan apakah Anda ingin CAS semantik atau tidak, dan jika Anda melakukannya, gunakan AtomicReference.
sumber
AtomicReference
menyediakan fungsionalitas tambahan yang tidak disediakan oleh variabel volatil sederhana. Karena Anda telah membaca API Javadoc, Anda akan mengetahui hal ini, tetapi juga menyediakan kunci yang dapat berguna untuk beberapa operasi.Namun, kecuali Anda membutuhkan fungsionalitas tambahan ini, saya sarankan Anda menggunakan
volatile
bidang yang sederhana .sumber
volatile
Bidang dapat digunakan seperti bidang biasa mana pun mengakses nilai dalamAtomicReference
membutuhkan melaluiget
danset
metode.Terkadang bahkan jika Anda hanya menggunakan get and set, AtomicReference mungkin merupakan pilihan yang baik:
Contoh dengan volatile:
Implementasi dengan AtomicReference akan memberi Anda sinkronisasi copy-on-write secara gratis.
Orang mungkin mengatakan bahwa Anda masih bisa memiliki salinan yang tepat jika Anda mengganti:
dengan:
Namun yang kedua lebih mungkin dihapus oleh seseorang secara tidak sengaja di masa depan selama "pembersihan kode".
sumber