java - AtomicReference<V> compareAndSwap是比较对象的地址吗
PHPz
PHPz 2017-04-18 10:40:51
0
2
503
PHPz
PHPz

学习是最好的投资!

membalas semua(2)
伊谢尔伦

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 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:

static {
  try {
    valueOffset = unsafe.objectFieldOffset
        (AtomicReference.class.getDeclaredField("value"));
  } catch (Exception ex) { throw new Error(ex); }
}

private volatile V value;

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:

Operasi CAS atom atom membandingkan offset memori, iaitu alamat memori.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan