Isu CAS dengan AtomicInteger - Limpahan Tindanan
我想大声告诉你
我想大声告诉你 2017-06-28 09:24:31
0
1
794
 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?

我想大声告诉你
我想大声告诉你

membalas semua(1)
刘奇

Laksatif~
Mungkin pemahaman penulis tentang soalan itu agak salah

  1. semasa ialah nilai yang dijangkakan, bukan nilai memori

  2. seterusnya ialah nilai baharu yang diubah suai, bukan nilai yang dijangkakan

Kod sumber

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的有关键字volatilepengubahsuaian

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 Tidak Selamat, Tidak Selamat sebenarnya merangkumi beberapa operasi seperti penunjuk, penunjuk tidak selamat)

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