Rumah > Soal Jawab > teks badan
public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
Ini ialah operasi kenaikan automatik, definisi: CAS mempunyai 3 operan, nilai memori V, nilai jangkaan lama A dan nilai baharu yang akan diubah suai B. Jika dan hanya jika nilai jangkaan A dan nilai ingatan V adalah sama, ubah suai nilai memori V kepada B, jika tidak lakukan apa-apa
Adakah nilai jangkaan seterusnya? Nilai memori adalah semasa?
Jika tiada saingan daripada utas lain apabila benang bertambah, maka nilai yang dijangkakan hendaklah 1 lebih besar daripada nilai memori Mengapakah nilai jangkaan dan nilai memori adalah sama?
怪我咯2017-06-28 09:26:31
Laksatif~
Mungkin pemahaman penulis tentang soalan itu agak salah
semasa ialah nilai yang dijangkakan, bukan nilai memori
seterusnya ialah nilai baharu yang diubah suai, bukan nilai yang dijangkakan
kaedahcompareAndSet
boleh dilihat, dan komen di dalamnya sangat jelas
/**
* Atomically sets the value to the given updated value
* if the current value {@code ==} the expected value.
*
* @param expect the expected value
* @param update the new value
* @return {@code true} if successful. False return indicates that
* the actual value was not equal to the expected value.
*/
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
Pengoperasian CAS adalah seperti yang dinyatakan oleh penyoal Ia membandingkan nilai yang diharapkan dengan nilai ingatan Hanya apabila mereka sama, nilai baru akan ditulis, ia akan terus mencuba nilai ingatan sebenar Sebenarnya ia adalah AtomicInteger.value
这个属性(其实最关键也不是这个属性,只是个引用而已,真正的boss后面会提到),注意这个value的有关键字volatile
pengubahsuaian
private volatile int value;
Jadi nilai ini sebenarnya pembolehubah dikongsi, yang mewakili keterlihatan pembolehubah ini, iaitu keterlihatan antara benang,
======================== Saya hanya bercakap terlalu banyak tentang keterlihatan, jika anda tidak suka anda boleh langkau sahaja === ======================= ======================
Secara ringkasnya, model memori Java menetapkan bahawa pembolehubah disimpan dalam memori utama (serupa dengan memori fizikal Setiap thread mempunyai cache kerja sendiri Apabila beroperasi pada pembolehubah tertentu, nilai dalam memori utama tidak diubah suai secara langsung , tetapi Ia dilaksanakan dalam cache kerjanya sendiri, dan akhirnya disegerakkan ke memori utama, dan benang tidak boleh mengakses cache kerja masing-masing
Keterlihatan yang disebutkan di sini bermakna apabila benang mengendalikan pembolehubah diubah suai dengan kata kunci volatile
, apabila pembolehubah berjaya diubah suai dan ditulis ke memori utama, pembolehubah dalam cache kerja benang lain akan menjadi tidak sah, jadi ini Apabila utas lain baca pembolehubah sekali lagi, mereka akan membacanya terus dari memori utama dan bukannya menggunakan nilai dalam cache kerja mereka sendiri
========================================== Selesai ====== = =========================================
Saya baru sahaja menyebut bahawa atribut AtomicInteger.value
hanyalah rujukan kepada data itu sendiri Apabila memanggil kaedah AtomicInteger.value
这个属性对于数据本身而言,只是一个引用,在调用compareAndSet
方法时,可以注意到第二个参数,valueOffset
,其实这才是关键...真正的Boss,真正的内存的值,因为涉及到在java语言里很少听到的一个词,指针,这个valueOffset
, anda boleh melihat parameter kedua, valueOffset
, Inilah kuncinya...Bos sebenar, nilai ingatan sebenar, kerana ia melibatkan perkataan yang jarang didengar dalam bahasa Java, penunjuk, ini valueOffset
Sebenarnya, ia adalah offset dalam objek Ini ialah nilai memori sebenar
(Sebab mengapa kaedah ini compareAndSet
里调用的是Unsafe
类的方法,Unsafe
memanggil kaedah kelas