Seperti kata penyoal, AtomicInteger kod sumber membandingkan dan menggantikan Integer untuk mencapai keselamatan benang. Dan AtomicReference ialah membandingkan dan menggantikan berbanding dengan rujukan objek. Ini adalah pelaksanaan CAS kelas atom.
Mengenai sama ada hendak membandingkan alamat, mulakan dengan AtomicReference yang disebut oleh penanya dan ketahui kaedah berikut:
public final boolean compareAndSet(V expect, V update) {
return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
}
Pelaksanaan asas adalah dalam kelas Unsafe, yang merupakan native kaedah setempat. CAS Unsafe termasuk tiga operan - lokasi memori untuk dibaca dan ditulis valueOffset, nilai yang hendak dibandingkan expected dan nilai baharu yang akan ditulis update. CAS mengemas kini nilai lama alamat memori secara atom dengan nilai baharu jika dan hanya jika nilai yang disimpan di lokasi memori V adalah sama dengan nilai perbandingan A. Jika tidak, tiada operasi dilakukan.
Kuncinya terletak pada peranan valueOffset yang masuk Teruskan melihat AtomicReference kod sumber:
Di sini, kaedah unsafeobjectFieldOffset adalah untuk mendapatkan mengimbangi memori objek, iaitu, melalui perbandingan di sini, anda boleh menentukan sama ada ia adalah alamat objek yang sama.
Jadi, kesimpulan:
Operasi CAS atom atom membandingkan offset memori, iaitu alamat memori.
ialah alamat, lebih tepatnya, nilai memori kedudukanOffset objek ini dibandingkan dengan jangkaan
Penjelasan terperinci yang tidak selamat
Seperti kata penyoal,
AtomicInteger
kod sumber membandingkan dan menggantikanInteger
untuk mencapai keselamatan benang. DanAtomicReference
ialah membandingkan dan menggantikan berbanding dengan rujukan objek. Ini adalah pelaksanaan CAS kelas atom.Mengenai sama ada hendak membandingkan alamat, mulakan dengan
AtomicReference
yang disebut oleh penanya dan ketahui kaedah berikut:Pelaksanaan asas adalah dalam kelas
Unsafe
, yang merupakannative
kaedah setempat. CASUnsafe
termasuk tiga operan - lokasi memori untuk dibaca dan ditulisvalueOffset
, nilai yang hendak dibandingkanexpected
dan nilai baharu yang akan ditulisupdate
. CAS mengemas kini nilai lama alamat memori secara atom dengan nilai baharu jika dan hanya jika nilai yang disimpan di lokasi memori V adalah sama dengan nilai perbandingan A. Jika tidak, tiada operasi dilakukan.Kuncinya terletak pada peranan
valueOffset
yang masuk Teruskan melihatAtomicReference
kod sumber:Di sini, kaedah
unsafe
objectFieldOffset
adalah untuk mendapatkan mengimbangi memori objek, iaitu, melalui perbandingan di sini, anda boleh menentukan sama ada ia adalah alamat objek yang sama.Jadi, kesimpulan: