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?
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
kaedah
compareAndSet
boleh dilihat, dan komen di dalamnya sangat jelasPengoperasian 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
pengubahsuaianJadi 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 kaedahAtomicInteger.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, inivalueOffset
Sebenarnya, ia adalah offset dalam objek Ini ialah nilai memori sebenar(Sebab mengapa kaedah iniTidak Selamat, Tidak Selamat sebenarnya merangkumi beberapa operasi seperti penunjuk, penunjuk tidak selamat)
compareAndSet
里调用的是Unsafe
类的方法,Unsafe
memanggil kaedah kelas